2017-09-22 8 views
0

私のクラウド機能を正常に終了するためにすべてのfirebaseの結果をループした後、どのようにしてリターンを得ることができますか?node.jsのforEachから戻り、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のままと私は「末端の後に書き込み」エラーを取得する - 私はforEachのから欠落しているの復帰のためにね。

+0

私はそれに答え@alexmacあなたの問題とは無関係な質問を持っている:あなたは約束の配列を生成するために、そしてPromise.allをすべての約束が解決されないまで待機するArray#mapを使用する必要があります。なぜES6(太い矢印)を使うのですが、 'const'と' let'を使わないのですか? –

+0

あなたは正しいです - 私はucNameと更新のために持っているはずです - 間違いありません。 カウントについてはそれほど明確ではありません - それは '定数'ではありません。私はfirebase、雲の関数、ノード、nodemailer、ハンドルバー、認証、ポリマー、PWAなどで "完成"した後でそれを読んでおく必要があります) –

+0

'count'は、 'count ++'、それは 'let'です。 'ucName'と' update'は変更されず、 'const'です。論文との幸運techs :) –

答えて

1

スナップの子が処理されない場合、最後のthenコールバックが呼び出されるためです。

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>`); 
    }); 
+0

ありがとう - 私はPromise.allの道にあったが、それを把握していない。ソリューションに感謝します。 –

関連する問題