我可以不等待就提交 Firestore 批量写入吗?
Can I commit a Firestore batch write without waiting?
概览
我想在 Cloud Functions 中创建一些文档引用,然后 return 它们将在另一个文档中使用。我的应用程序时间紧迫,所以我不想在 return 引用之前等待批处理提交。
当前解决方案
我目前在一个 Cloud Function 中创建引用和目标文档,然后提交整批。这使我的代码重复,因为我还需要在其他地方创建这些引用。
我的问题
如果我从 batch.commit()
中省略 .then
,我可以简单地直接传递引用并让 Cloud Firestore 在自己的时间编写文档吗?
我已经创建了这个有效的测试脚本。这种方法有问题还是我应该一直等待批处理完成后再继续执行代码?
我的示例代码
// 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 Functions 没有正确处理所有异步工作(通常使用 promises),工作很可能无法成功完成。
对于 HTTP 触发器,您必须仅在所有未决工作完成后向客户端发送最终响应。
对于所有其他类型的触发器,您必须return一个仅在该函数中的所有异步工作完成后才解析的承诺。
您现在拥有的是 "dangling" 未根据这些规则处理的承诺。如果您使用 ESLint 或 TSLint 检查您的代码,linter 可能会检测到这一点并抱怨它。
概览
我想在 Cloud Functions 中创建一些文档引用,然后 return 它们将在另一个文档中使用。我的应用程序时间紧迫,所以我不想在 return 引用之前等待批处理提交。
当前解决方案
我目前在一个 Cloud Function 中创建引用和目标文档,然后提交整批。这使我的代码重复,因为我还需要在其他地方创建这些引用。
我的问题
如果我从 batch.commit()
中省略 .then
,我可以简单地直接传递引用并让 Cloud Firestore 在自己的时间编写文档吗?
我已经创建了这个有效的测试脚本。这种方法有问题还是我应该一直等待批处理完成后再继续执行代码?
我的示例代码
// 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 Functions 没有正确处理所有异步工作(通常使用 promises),工作很可能无法成功完成。
对于 HTTP 触发器,您必须仅在所有未决工作完成后向客户端发送最终响应。
对于所有其他类型的触发器,您必须return一个仅在该函数中的所有异步工作完成后才解析的承诺。
您现在拥有的是 "dangling" 未根据这些规则处理的承诺。如果您使用 ESLint 或 TSLint 检查您的代码,linter 可能会检测到这一点并抱怨它。