如何确保云功能中的所有操作都已成功完成?



我正在使用Firebase Cloud Functions,它是由在Firestore中创建文档触发的。在创建对象时,我需要并行执行两个不同的操作:

  1. 更新特定文档中字段的值(不是创建并触发云函数的文档(
  2. 在另一个文档上运行事务

所以我的问题是:

  1. 结束云功能本身之前,如何确保我的两个操作都已成功完成?
  2. 如何为两个操作中的每一个实现单独的重试机制(因为我不希望整个函数使用通用重试机制,因为它可以重做事务操作,即使它是另一个操作失败(?

这是我当前的代码:

exports.onCityCreated = functions.firestore
.document('Cities/{cityId}')
.onCreate((snap, context) => {
const db = admin.firestore(); 
const newCity = snap.data();
const mayorId = newEvent.mayorID;
const mayorRef = db.doc('Users/'+ mayorId);
const timestamp = admin.firestore.FieldValue.serverTimestamp();
db.doc('Utils/lastPost').update({timestamp: timestamp});    //First Operation - Timestamp Update
return db.runTransaction(t => {    //Second Operation - Transaction
return t.get(mayorRef).then(snapshot => {
var new_budget = snapshot.data().b - 100;
return t.update(mayorRef, {b: new_budget});
})
.then(result => {
return console.log('Transaction success!');
})
.catch(err => {
console.log('Transaction failure:', err);
});
});
});

每当有多个这样的操作时,解决方案是使用Promise.all().这需要一系列承诺,进而返回一个承诺,该承诺在您传递的所有承诺都已解决时解析。

exports.onCityCreated = functions.firestore
.document('Cities/{cityId}')
.onCreate((snap, context) => {
const db = admin.firestore(); 
const newCity = snap.data();
const mayorId = newEvent.mayorID;
const mayorRef = db.doc('Users/'+ mayorId);
const timestamp = admin.firestore.FieldValue.serverTimestamp();
var p1 = db.doc('Utils/lastPost').update({timestamp: timestamp});
var p1 = db.runTransaction(t => {
return t.get(mayorRef).then(snapshot => {
var new_budget = snapshot.data().b - 100;
return t.update(mayorRef, {b: new_budget});
})
});
return Promise.all([p1, p2]);
});

最新更新