我有一个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({
完成后再退还一次诺言。
我想移动avgRating
和numRatings
并将其设置在admin.firestore().doc('/publicUserInfo/${uid}');
上。
任何帮助都将不胜感激。
答案 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。它将为您节省很多时间。