【问题标题】:Return multiple Promises (Firebase Cloud Functions)返回多个 Promise(Firebase 云函数)
【发布时间】:2020-03-31 02:06:39
【问题描述】:

我有一个 Firebase Cloud 函数,可以将新认证的用户添加到 Firestore 数据库中。

当前函数

exports.createUserAccount = functions.auth.user().onCreate((user) => {
    const uid = user.uid;
    const privateUserInfoRef = admin.firestore().doc(`/privateUserInfo/${uid}`);
    return privateUserInfoRef.set({
        isAnonymous: true,
        avgRating: 0,
        numRatings: 0,
        loggedInAt: Date.now()
    });
});

但是,我想在返回 privateUserInfoRef.set({ 完成后返回另一个承诺。

我想将avgRating 和numRatings 换成admin.firestore().doc('/publicUserInfo/${uid}');。

【问题讨论】:

  • 那么,privateUserInfoRef.set 返回一个 Promise?使用.then 链接下一个承诺
  • 你能提供更多关于.then链的信息吗?
  • somePromise.then(function(result) { return someOtherPromise; }).then(function(resultofOther) { ... })等

标签: javascript promise google-cloud-functions


【解决方案1】:

如果您想运行多个操作,一个接一个地运行,并返回最后一个(或第一个失败的)的结果,您可以链接then() 子句:

return privateUserInfoRef.set({
  isAnonymous: true,
  avgRating: 0,
  numRatings: 0,
  loggedInAt: Date.now()
}).then((resultOfSet) => {
  return anotherRef.set(...); 
});

您可以根据需要重复此链。


如果您有多个可以并行运行的操作,您也可以使用Promise.all() 返回所有操作的组合结果:

return Promise.all([
    privateUserInfoRef.set(...)
    anotherRef.set(...)
]);

返回值将是一个数组,其中包含各个 set() 操作的结果。


我只是在这里使用set() 操作作为示例。此模式适用于任何返回承诺的调用,包括(对于实时数据库)once() 和 push(),但也适用于返回承诺的非 Firebase 操作。

【讨论】:

    【解决方案2】:

    试试这个:

    return privateUserInfoRef.set({
        isAnonymous: true,
        avgRating: 0,
        numRatings: 0,
        loggedInAt: Date.now()
    })
    .then(() => {
        return admin.firestore().doc(...).update(...);
    });
    

    then 返回一个将传播到return 语句的承诺。继续链接then 块来做更多的异步工作。 Cloud Functions 将等待整个链完成。这是 JavaScript 中的基本承诺处理(但使用 async/await 语法会更容易)。

    我强烈建议广泛学习 JavaScript Promise 工作,以便在 nodejs 上有效使用 Cloud Functions。将来会为您节省大量时间。

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 2021-05-31
      • 2018-12-05
      • 2018-06-12
      • 2019-08-06
      • 2021-06-21
      • 1970-01-01
      • 2018-12-03
      • 2019-11-03
      相关资源
      最近更新 更多