【问题标题】:Why set on collection item returns pending promise为什么在集合项目上设置返回待处理的承诺
【发布时间】:2019-09-24 09:29:33
【问题描述】:

运行这个:

db.collection("test").doc()
                    .set({
                        value: 100
                    }).then(resultOrWhateverItReturns => { /*never executed*/ });

返回一个始终保持其pending 状态的承诺,因此then 分支中的代码永远不会执行(我想同样的问题也适用于catch 之一)。我看到一些people 用另一个承诺包装set 并在set 调用之后立即解决它,因此处理它就像处理同步调用一样,这看起来不正确。

有没有办法启动插入/更新命令返回有用的,即履行/拒绝的承诺?我正在使用 v.6.6.1 的 sdk。

更新 1 - Cloud Firestore 文档 suggests 以下方法对我不起作用,因为 set 返回的承诺处于待处理状态。实际数据确实会更新。

db.collection("users").doc("frank").set({
  name: "Frank",
  favorites: {
    food: "Pizza",
    color: "Blue",
    subject: "Recess"
  },
  age: 12
}).then(function() {
  console.log("Frank created");
});

【问题讨论】:

  • "which doesn't work for me" 这段代码在运行时做什么?你期望它做什么?
  • "then" 分支永远不会为我执行。数据被添加/更新,但部分从未被调用。理想情况下,我也想获得文档的自动生成 ID。 + 哥们,这里的语言不需要很聪明。
  • 我并不是想在这里变得聪明,只是想提供帮助,我不清楚什么是行不通的。您使用的是哪个 SDK?浏览器中的客户端 JavaScript?还是 Node.js?
  • JS one v. 6.6.1 位于gstatic.com/firebasejs/6.6.1/firebase-firestore.js 我更新了这个问题,希望它可以解决。
  • 您对收藏有写权限吗?否则,您的写作将被拒绝。如果不确定,请将catch() 子句添加到您的处理程序。 .catch(function(e) { console.error(e); })。另见:jsbin.com/varegoc/2/edit?js,console

标签: firebase google-cloud-platform google-cloud-firestore


【解决方案1】:

为什么不直接使用 async-await 呢? 例如:

 await db.collection('users').doc('frank').set({
         name: "Frank",
         favorites: {
         food: "Pizza",
         color: "Blue",
         subject: "Recess"
       },
       age: 12
 });

有一个这样的异步函数:

const updateFn = async (userDetails) => {}

并使用 await 调用集合更新?

【讨论】:

  • 它不会有任何区别,所有 await 都会阻止执行,直到 promise 得到解决,这永远不会发生。我问的问题是为什么 set 返回的 promise 总是挂起,请再读一遍。
猜你喜欢
  • 1970-01-01
  • 2020-12-18
  • 2021-07-22
  • 2020-12-20
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多