2017-01-13 11 views
0

コールバックでnull値を取得する でも、コンソールで値を取得していますconsole.log(list)forEachネストされたFirebaseでコールバックを取得するには

しかし、私は完全にすべてのforEach操作afetr finallistたいとlist

var list = []; 
var mkeys = ['-Ka2D86jpdjKpTf2-Nmf', '-KaCPtlIoPX34ltMPqs3']; 

    function Getumanes(msgkeys,callback) { 
    msgkeys.forEach(function (key) { 
     var msgstref = firebase.database().ref("Msgtemplate/" + key + '/Actionusers'); 
     msgstref.orderByChild('status').equalTo(true).limitToFirst(2).once('value').then(function (snap) { 
      snap.forEach(function (csnap) { 
       list.push(csnap.key); 
      }) 
      console.log(list); 
     }) 
    }) 
    callback(list) 
} 

Getumanes(mkeys, function (finallist) { 
    console.log("finallist: " + finallist); 
}); 
+0

Firebaseはデータを非同期で収集する傾向があります。そのため、リストにはそれが入力される前にコンソールに送信されている可能性があります。 'list'を使う前に、非同期コールバックが完了するまで待つ必要があります。 –

+0

Thanx @Alex、あなたはどのようにそれを達成することができますか?いくつかのコードの一部で –

+0

基本的に値はコールバック内で計算され、コールバックはconsole.log(list)の後に実行され、その平均リストは空です。コールバック内のconsole.logにデータが表示されます。それが非同期要求の仕組みです。それらは呼び出され、残りのコードが実行され、要求が完了するとコールバックが実行されます。 – GillesC

答えて

1

Firebaseデータベース(およびほとんどすべての最新のWeb /クラウドAPI)にアクセス、バックへの呼び出しにすべてのcsnap.keyプッシュ終了は非同期に発生します。データがロードされるのを待つ代わりに、メインメソッドのコードは、データがロードされている間、継続されます。データがロードされると、コールバック関数が呼び出されます。

これを把握する最も簡単な方法は、問題を再構成することです。 「最初にデータを取得してから印刷する」と考えるのではなく、「データのロードを開始してから、データが利用可能になったら印刷してください」と考えてください。コードでは、このにデータを印刷するためのロジックを動かすに翻訳コールバック:このコードで

mkeys.forEach(function (key) { 
    var msgstref = firebase.database().ref("Msgtemplate/" + key + '/Actionusers'); 
    msgstref.orderByChild('status').equalTo(true).limitToFirst(2).once('value').then(function (snap) { 
     snap.forEach(function (csnap) { 
      list.push(csnap.key); 
     }) 
     console.log(list); 
    }) 
}) 

そしてもちろんconsole.logのは、あまりにも他の何かである可能性があります。

この問題は、FirebaseとWebプログラミングの両方で、これまでに多くの問題がありました。 Java用

私が言ったように...よくある質問です。 :-)

+0

Thanx Thanx @Frank van Puffelen、しかし、私は結果として最後の配列を欲しがっていますが、現在、私は外側のforEachから2つのvauesを持っているので、2つの配列に渡っています。 –

0

FROM var list = [];リストを変更します。 TOリスト:FirebaseListObservable;

呼び出しメソッドでは、このリストを返す関数をサブスクライブするので、UI内でも要素がそれに応じて更新されます。

関連する問題