You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,你可以把清理弹窗的逻辑抽成一个独立函数,然后在thencatch里分别调用,达到和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

火山引擎 最新活动