Google Cloud Functions:如何使用forEach从Firebase数据库中检索一些结果?

时间:2018-03-20 23:54:01

标签: firebase firebase-realtime-database google-cloud-functions

我需要向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);
            });
        }
    });
}

所以底线: 我需要在循环内做一些请求,然后从方法返回。

2 个答案:

答案 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);
}