我正在尝试批量提交,但它没有按预期工作,这是我的代码
exports.test = functions.https.onRequest(async (req, res) => {
const firestore = admin.firestore();
const batch = firestore.batch();
try {
let snapUser = await admin.firestore().collection("users").get();
const batch = firestore.batch();
snapUser.docs.forEach(async (doc) => {
let snapObject = await doc.ref.collection("objects").get();
if (!objectSnapShot.empty) {
objectSnapShot.docs.forEach((doc) => {
batch.set(
doc.ref,
{
category: doc.data().category,
},
{
merge: true,
}
);
});
await batch.commit()
}
});
res.status(200).send("success");
} catch (error) {
functions.logger.log("Error while deleting account", error);
}
});
我做错什么了吗?
如有任何帮助,将不胜感激
await batch.commit()
在循环的每个迭代中运行,但您只能提交一次批处理。您必须在执行循环之后提交它。
snapUser.docs.forEach(async (doc) => {
// add operations to batch
});
await batch.commit()
此外,当使用async-await
而不是forEach()
循环时,使用for
循环可能更好。有关详细信息,请使用带有forEach循环的async/await进行签出。
在提交事务和/或您正在使用同一个batch
对象来执行多个提交。如果需要,您可以继续为每次提交创建一个新的batch
对象。你可以试着从小处着手,把事情分解,以真正理解这些概念。在异步操作尝试写入WriteBatch之前,它似乎已经关闭。
批处理过程需要有两个部分,一个主函数和一个来自每个批的回调。问题是,一旦提交了第一批处理,您就试图重新声明批处理过程。您的主函数是一个异步函数,它将继续异步运行所有方法,忽略任何内部函数。您必须确保在尝试提交之前添加了应用于批处理的所有作业,这是一个竞争条件
您可以通过多种方式处理这些问题,例如用承诺链包装它或创建回调。查看以下文档以了解管理数据事务。