Firestore操作后使用finally块清理资源报错问题咨询
解决Firestore操作后
finally块报错的问题 你遇到的finally is not a function报错,大概率是因为你使用的Firebase JavaScript SDK版本比较旧——早期版本的Firebase Promise并没有实现ES2018引入的finally方法。下面给你几个可行的解决方案:
方案一:升级Firebase SDK到最新版本
现在新版本的Firebase SDK已经完全支持Promise的finally方法,升级后你可以直接沿用原本的代码逻辑。升级方式根据你的项目类型来:
- 如果是npm项目,执行
npm install firebase@latest更新依赖; - 如果是CDN引入,替换成最新的SDK链接(比如v8稳定版的
https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js,或者更现代的v9模块化版本)。
升级后你的代码就能正常运行,示例如下:
db.collection("posts") .doc(doc.id) .set(post) .then(function(docRef) { // 处理成功后的逻辑,比如提示保存成功 }) .catch(function(error) { console.error("Error saving post : ", error); }) .finally(function(){ // 这里写关闭弹窗的逻辑,不管保存成功还是失败都会执行 // 例如:document.getElementById('your-dialog').close(); });
方案二:不升级SDK的替代方案
如果暂时无法升级SDK,你可以把清理弹窗的逻辑抽成一个独立函数,然后在then和catch里分别调用,达到和finally一样的效果:
// 定义清理函数 function closeDialog() { // 关闭弹窗的具体逻辑 // 比如:dialogInstance.close(); } db.collection("posts") .doc(doc.id) .set(post) .then(function(docRef) { // 成功逻辑 closeDialog(); }) .catch(function(error) { console.error("Error saving post : ", error); closeDialog(); });
另外也可以用原生Promise包装Firestore的操作结果(如果你的运行环境支持原生Promise的finally),这样也能绕过旧SDK的限制:
Promise.resolve(db.collection("posts").doc(doc.id).set(post)) .then(function(docRef) { // 成功逻辑 }) .catch(function(error) { console.error("Error saving post : ", error); }) .finally(function(){ // 关闭弹窗 });
总结一下,finally是处理资源清理的最佳方式,优先推荐升级SDK来使用它;如果有版本限制,用抽离公共函数的方式也能实现同样的效果。
内容的提问来源于stack exchange,提问作者user1279144




