我需要向DB发送一些请求并更新响应中的每个条目。
我正在尝试使用forEach / for,但就每个/是异步,我无法找到如何使用循环对Firebase数据库执行一些请求的方法。
任何想法?
这是我的代码。我已经尝试在周期内与计数器一起工作。但不幸的是,这对我不起作用。
function updateMethod(inputArray) {
return new Promise((resolve, reject) => {
var updates = {};
var ctr = 0;
for (let i = 0; i < inputArray.length; i++) {
db.ref("/foo").orderByChild("finished").equalTo(inputArray[i]).once("value", (snapshot) => {
ctr++;
var key = snapshot.key;
updates['transactions/' + key + '/finished'] = true;
if (ctr === inputArray.length) {
resolve(updates);
}
}).catch((e) => {
console.log(e);
});
}
});
}
所以底线: 我需要在循环内做一些请求,然后从方法返回。
答案 0 :(得分:1)
不要将回调传递给once(),而是使用其返回的承诺。
将每次调用once()返回的所有承诺收集到一个数组中,然后将其传递给Promise.all()以创建一个新的承诺,在所有其他承诺得到解决后解析。您可以返回该快照,或对快照进行进一步处理,并返回一个不同的Promise,它以您希望调用者拥有的最终值进行解析。
答案 1 :(得分:1)
您可以更新代码以进入承诺列表并等待所有承诺完成,例如:
function updateMethod(inputArray) {
var promises = [];
var updates = {};
var ctr = 0;
for (let i = 0; i < inputArray.length; i++) {
var promise = db.ref("/foo")
.orderByChild("finished")
.equalTo(inputArray[i])
.once("value", (snapshot) => {
var key = snapshot.key;
updates['transactions/' + key + '/finished'] = true;
}).catch((e) => {
console.log(e);
});
promises.push(promise);
}
return Promise.all(promises);
}