【发布时间】:2021-03-22 18:36:26
【问题描述】:
我必须在几个 refs 处获取数据并在几个 refs 处更新。除了我必须更新的第四个参考 loopArrAtFourthRef 之外,一切正常。它通过循环从第三个获取它的值。 问题是第五个参考在第四个参考之前完成。我是一名 Swift 开发人员,但我无法掌握 Promises,它们对我来说太陌生了。
exports.updateMultipleRefs = functions.https.onCall((data, context) => {
// ... values from data used in refs
const fetchFromFirstRef = admin.database()....
const updateAtSecondRef = admin.database()....
const runTransactionAtSecondRef = admin.database()....
const fetchArrDataFromThirdRef = admin.database()....
const loopArrAtFourthRef = admin.database()....
const updateFifthRef = admin.database()....
var arr = [];
var promises = [];
var val_1 = 0;
var val_2 = 0;
return fetchFromFirstRef
.once('value')
.then((snapshot) => {
if (snapshot.exists()) {
snapshot.forEach((childSnapshot) => {
// val_1 += data from each childSnapshot
});
return updateAtSecondRef.update({ "val_1":val_1 }).then(()=> {
return runTransactionAtSecondRef.set(admin.database.ServerValue.increment(1));
}).then(() => {
return fetchArrDataFromThirdRef
.once('value')
.then((snapshot) => {
if (snapshot.exists()) {
snapshot.forEach((childSnapshot) => {
var gameId = childSnapshot.key;
arr.push(gameId);
});
} else {
return null;
}
});
}).then(() => {
// this is where I'm having the problem, the fifth ref finishes before this does
for (var i = 0; i < arr.length; i++) {
var gameId = arr[i];
var promiseRef = loopArrAtFourthRef.child(gameId);
promises.push(promiseRef.once('value').then((snap) => {
snap.forEach((child) => {
// val_2 += data from each child
});
}));
return Promise.all(promises);
}
}).then(() => {
return updateFifthRef.update({ "val_2": val_2 });
});
} else {
return null;
}
})
.catch((error) => {
console.log('error', error);
return null;
});
});
【问题讨论】:
标签: firebase-realtime-database google-cloud-functions