如何使用Flutter应用程序的Firebase Cloud function在get函数中等待写入函数



所以,我真的不知道如何写JS,我正在Flutter中开发一个移动应用程序,如果能得到一些关于JS中Future/Promises的帮助和澄清,我将不胜感激。

我得到了每个用户的帖子集合,我想创建一个.onCreate函数,当用户发布新帖子时(在'posts/userId/user_posts'集合中创建了一个新文档(,它会获取用户的所有追随者(来自集合'user_followers/userUid'(,对于每个追随者,它将postUid和postOwnerUid写入该关注者的newsFeed集合('user_news_feed/followerId'(。

这就是我现在得到的,但我是盲目的,因为我真的不知道JS,我不知道如何在get函数中等待写函数。

如何防止云超时?例如,如果用户有1000名关注者,我如何防止Firebase关闭我的功能并确保通知所有关注者?

exports.writeToUserNewsFeed = functions.firestore
.document('posts/{userId}/user_posts/{postId}')
.onCreate((snap, context) => {
const postData = snap.data();
const postUid = postData['post_uid'];
const userUid = postData['user_uid'];
const postCreationDate = postData['post_creation_date'];
var docRef = db.collection('user_followers').doc(userUid).collection('followers');
docRef.get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
db.collection('user_news_feed')
.doc(doc.data['uid'])
.collection('feed')
.document(postUid)
.set({
'post_uid': postUid,
'user_uid': userUid,
'post_uid': postCreationDate,
});
});
});
});

如文档中所述,在像Firestore的onCreate()这样的后台云函数中,当所有异步工作完成时,您需要返回Promise。因此,在您的情况下,一种可能性是使用Promise.all(),因为您不知道followers子集合中有多少文档。由于Promise.all()返回单个Promise,您可以将其包含在需要在Cloud Function中返回的Promise链中。

exports.writeToUserNewsFeed = functions.firestore
.document('posts/{userId}/user_posts/{postId}')
.onCreate((snap, context) => {
const postData = snap.data();
const postUid = postData['post_uid'];
const userUid = postData['user_uid'];
const postCreationDate = postData['post_creation_date'];
var followersColRef = db.collection('user_followers').doc(userUid).collection('followers');
return followersColRef.get().then((querySnapshot) => {   // <= See return here
const promises = [];
querySnapshot.forEach((doc) => {
promises.push(
db.collection('user_news_feed')
.doc(doc.data['uid'])
.collection('feed')
.doc(postUid)
.set({
'post_uid': postUid,
'user_uid': userUid,
'post_uid': postCreationDate,
})
);
});
return Promise.all(promises);   // <= See return here
})
.catch(error => {
console.log(error);
return null;
})
});

请注意,您也可以使用批处理写入,而不是使用Promise.all(),但批处理写入的操作限制为500次。

相关内容

  • 没有找到相关文章