批量写入可确保写入是原子完成的:如果其中一个写入失败,则其他写入不会执行。另一方面,为了回答您上面的评论,批量写入并不能确保所有写入都是“瞬时”的,顺便说一句,这是一个很难在 IT 中定义的概念,恕我直言:- )。 AFAIK,批量写入并不能确保写入将按照推送到批次的顺序完成。
因此,如果您想在组成批量写入的所有写入完成时触发第二个云函数,您可以使用通过 Pub/Sub 触发的云函数。
具体来说,在您的index.js
云函数文件:
声明一个发布消息的函数:
async function publishMessage(messageConfig) {
try {
const pubSubClient = new PubSub();
const topicName = messageConfig.topicName;
const pubSubPayload = messageConfig.pubSubPayload;
let dataBuffer = Buffer.from(JSON.stringify(pubSubPayload));
await pubSubClient.topic(topicName).publish(dataBuffer);
} catch (error) {
throw error;
}
}
在提交批量的云函数中,当批量写入完成时发布一条消息:
await batch.commit();
messageConfig = {
topicName: 'your-topic',
pubSubPayload: {
docA_Id: '..........', // Id of doc A
docB_Id: '..........' // Id of doc B
}
}
await publishMessage(messageConfig);
// ...
编写一个发布/订阅触发的云函数来执行所需的业务逻辑。如果需要通过以下方式触发相同的业务逻辑onWrite
触发器,共享两个函数之间的代码
exports.updateDocB = functions.pubsub.topic('your-topic').onPublish(async (message) => {
const docA_Id = message.json.docA_Id;
const docB_Id = message.json.docB_Id;
await updateDocB(docA_Id, docB_Id);
// ...
})
async function updateDocB(docA_Id, docB_Id) {
// ......
}
// Call this function from the onWrite CF
如果你想避免这种情况onWrite
执行批量写入时触发云函数,您可以使用唯一的云函数标记文档A和BeventId https://firebase.google.com/docs/reference/functions/cloud_functions_.eventcontext#eventid通过批量写入。如果 A 和 B 中的该标志相同,则不会执行onWrite
触发了云函数,因为它将由 pub.sub 云函数处理。
当然,这是基于几个假设,并且必须应对事件的发展,但这可能是一个可能的解决方案!