flutter - 为什么我的 Firebase 更新功能并不总是有效?
问题描述
我试图弄清楚为什么我的firebase作弊功能总是在创建但是当像打开它调用create函数的聊天时立即发送一条消息,该消息将不会被保存,因为我的功能还没有准备好,所以我怎么能做到这一点?这是我的功能。
export const onConversationCreated = functions.firestore.
document("Conversations/{conversationID}").onCreate((snapshot, context) => {
const data = snapshot.data();
const conversationID = context.params.conversationID;
if (data) {
const members = data.members;
for (let index = 0; index < members.length; index++) {
const uid = members[index];
const remainingUserIDs = members.filter((u: string) => u !== uid);
remainingUserIDs.forEach((m: string) => {
return admin.firestore().
collection("profile").doc(m).get().then((_doc) => {
const userData = _doc.data();
if (userData) {
return admin.firestore().collection("profile")
.doc(uid).collection("Conversations").doc(m).create({
"conversationID": conversationID,
"url": userData.url,
"name": userData.username,
"unseenCount": 0,
});
}
return null;
}).catch(() => {
return null;
});
});
}
}
return null;
});
export const onConversationUpdated = functions.firestore
.document("Conversations/{conversationID}").onUpdate((change, context) => {
const data = change?.after.data();
if (data) {
const members = data.members;
const lastMessage = data.messages[data.messages.length - 1];
for (let index = 0; index < members.length; index++) {
const uid = members[index];
const remainingUserIDs = members.filter((u: string) => u !== uid);
remainingUserIDs.forEach((u: string) => {
return admin.firestore().collection("meinprofilsettings")
.doc(uid).collection("Conversation").doc(u).update({
"lastMessage": lastMessage.message,
"timestamp": lastMessage.timestamp,
"type": lastMessage.type,
"lastmessageuid": lastMessage.senderID,
"unseenCount": admin.firestore.FieldValue.increment(1),
});
});
}
}
return null;
});
所以再次创建是正确的工作。它只是需要一些时间。当我在调用创建函数时立即写一条消息并发送它时,在创建函数完成之前,这条消息不会被保存,那么我必须再次发送消息
解决方案
您的错误的原因是您没有async
正确等待任务的执行。不幸的是,forEach
不支持async
,所以我们需要将您的代码改写为这样的:
export const onConversationCreated = functions.firestore
.document("Conversations/{conversationID}")
.onCreate((snapshot, context) => {
const data = snapshot.data();
const promises: Promise<any>[] = [];
const conversationID = context.params.conversationID;
if (data) {
const members = data.members;
for (let index = 0; index < members.length; index++) {
const uid = members[index];
const remainingUserIDs = members.filter((u: string) => u !== uid);
remainingUserIDs.forEach((m: string) => {
promises.push(
admin
.firestore()
.collection("profile")
.doc(m)
.get()
.then((_doc) => {
const userData = _doc.data();
if (userData) {
return admin
.firestore()
.collection("profile")
.doc(uid)
.collection("Conversations")
.doc(m)
.create({
conversationID: conversationID,
url: userData.url,
name: userData.username,
unseenCount: 0,
});
}
return null;
})
);
});
}
}
return Promise.all(promises);
});
export const onConversationUpdated = functions.firestore
.document("Conversations/{conversationID}")
.onUpdate((change, context) => {
const data = change?.after.data();
const promises: Promise<any>[] = [];
if (data) {
const members = data.members;
const lastMessage = data.messages[data.messages.length - 1];
for (let index = 0; index < members.length; index++) {
const uid = members[index];
const remainingUserIDs = members.filter((u: string) => u !== uid);
remainingUserIDs.forEach((u: string) => {
promises.push(
admin
.firestore()
.collection("meinprofilsettings")
.doc(uid)
.collection("Conversation")
.doc(u)
.update({
lastMessage: lastMessage.message,
timestamp: lastMessage.timestamp,
type: lastMessage.type,
lastmessageuid: lastMessage.senderID,
unseenCount: admin.firestore.FieldValue.increment(1),
})
);
});
}
}
return Promise.all(promises);
});
我们Promise.all()
甚至可以async
并行运行您的所有任务,以更快地完成功能并节省执行时间。
推荐阅读
- docker - 无法在 Jenkins 上的不同容器上的卷之间共享数据
- python - SonarQube 的记录器配置安全警告
- django - 如何在端口 6379 上启动 Redis 服务器
- delphi - 在子类中添加重载
- python - 为什么我需要单击两次才能退出我的 python 程序?
- blender - 如何在搅拌机中将立方体的原点设置为其顶点?
- python - 读取数字数据文件并同时分配给每个项目
- groovy - XmlSlurper 不返回值
- android - D8 编译到 API 级别 21 及以上时不支持 main-dex 输入和输出
- sql - 使用 FOR JSON PATH 时解析 NVARCHAR 列内的 JSON 文本