返回多个承诺(Firebase云功能)

时间:2019-12-06 04:50:52

标签: javascript promise google-cloud-functions

我有一个Firebase云功能,可以将经过新身份验证的用户添加到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({完成后再退还一次诺言。

我想移动avgRatingnumRatings并将其设置在admin.firestore().doc('/publicUserInfo/${uid}');上。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果您想一次执行多个操作,然后返回最后一个(或失败的第一个)的结果,则可以链接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操作。

答案 1 :(得分:0)

尝试一下:

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

then返回一个承诺,该承诺将传播到return语句。继续链接then块以执行更多异步工作。云功能将等待,直到整个链完成。这是JavaScript中的基本诺言处理(但使用async / await语法会变得更加容易)。

我强烈建议广泛学习JavaScript承诺工作,以便在nodejs上有效利用Cloud Functions。它将为您节省很多时间。