从node.js中的forEach返回以循环遍历firebase结果

时间:2017-09-22 10:54:26

标签: node.js firebase foreach promise google-cloud-functions

在循环浏览所有firebase结果以正确完成云功能后,如何获得返回?

var count = 0;
return ref.child('/records').once('value').then(snap=>{
    snap.forEach(snapChild=>{
        var ucName = ${snapChild.val().name.toUpperCase();
        var update = {'name':ucName);
        ref.child(`/records/${snapChild.key}`).update(update).then(()=>{
            count++;
            res.write(`<p>${ucName} updated</p>`);
        });
    })
}).then(()=>{
    return res.end(`<p>end of list (${count} records)</p>`);
})

它实际上做了应该做的事情,但是计数器保持在0并且我得到一个错误&#39;写完了结束&#39; - 我想是因为forEach缺少回报。

1 个答案:

答案 0 :(得分:1)

这是因为在未处理快照子项时调用了最后一个then回调。您需要使用Array#map生成一系列承诺,并Promise.all等待所有承诺都未解决:

var count = 0;
return ref
  .child('/records').once('value')
  .then(snap => {
    let ops = snap.map(snapChild => {
        var ucName = ${snapChild.val().name.toUpperCase();
        var update = {'name':ucName);
        return ref.child(`/records/${snapChild.key}`).update(update).then(() => {
            count++;
            res.write(`<p>${ucName} updated</p>`);
        });
    });
    return Promise.all(ops);
  })
  .then(()=>{
    return res.end(`<p>end of list (${count} records)</p>`);
  });