我可以在不等待的情况下提交Firestore批量写入吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以在不等待的情况下提交Firestore批量写入吗?相关的知识,希望对你有一定的参考价值。

Overview

我想在Cloud Function中创建一些文档引用并返回它们以在另一个文档中使用。我的应用程序是时间关键的,所以我不想在返回引用之前等待批处理提交。

当前解决方案

我目前在一个Cloud Function中创建引用和目标文档,然后提交整个批处理。这使我的代码重复,因为我需要在其他地方创建这些引用。

我的问题

如果我省略.then中的batch.commit(),我可以简单地直接传递引用并离开Cloud Firestore在自己的时间写入文档吗?

我创建了这个测试脚本,它有效。这种方法有问题还是我应该在继续执行代码之前总是等待批处理完成?

My sample code

// Set the data to be written
let myData = {test: '123'};

// Create the document references and return them for future processing
let docRefs = writeData(myData);

// Write these references to a master document
myDoc = {
  name: 'A document containing references to other documents',
  doc0Ref: docRefs[0],
  doc1Ref: docRefs[1],
  doc2Ref: docRefs[2]
}
return db.collection('masterCollection').add(myDoc).then(response => {
  console.log('Success');
  return Promise.resolve();
}).catch(err => {
  console.error(err);
  return Promise.reject(err);
});

// Create the batch and write the data
function writeData(myData) {
  let batch = firestore.batch();

  let doc1Ref = firestore.collection('test').doc();
  let doc2Ref = firestore.collection('test').doc();
  let doc3Ref = firestore.collection('test').doc();

  console.log(`doc1Ref: ${doc1Ref.id}, doc2Ref: ${doc2Ref.id}, doc3Ref = ${doc3Ref.id}`);

  batch.set(doc1Ref, myData);
  batch.set(doc2Ref, myData);
  batch.set(doc3Ref, myData);

  batch.commit(); // No .then to wait for the batch to be written
  return [doc1Ref, doc2Ref, doc3Ref];
}
答案

如果您的Cloud Function未正确处理所有异步工作(通常是使用promises),则很可能无法成功完成工作。

对于HTTP触发器,您必须在完成所有待处理工作后才将最终响应发送给客户端。

对于所有其他类型的触发器,您必须返回仅在该函数中的所有异步工作完成后才能解析的promise。

你现在所拥有的是一个“晃来晃去”的承诺,根据这些规则不予处理。如果您正在使用ESLint或TSLint检查您的代码,那么linter可能会检测到并抱怨它。

以上是关于我可以在不等待的情况下提交Firestore批量写入吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用index.js文件中的触发器功能的情况下从Firestore数据库读取数据?

Firestore - 如何在不真正获取所有文档的情况下找到可以使用查询获取的文档数量? [复制]

在不使用 Firebase 身份验证的情况下设置 Firestore 安全规则

我们可以在不重新设置整个适配器的情况下更新 Firestore 回收器适配器的查询吗?

在不循环的情况下查询 Firestore 集合中的所有文档

Firestore 在不重新加载应用程序的情况下不更新 SwiftUI 网格