2017-01-09 15 views
0

私はスナップショットのプロパティを配列に保存しようとしましたが、何らかの理由でクエリ内にデータを格納すると、たとえばonまたはchild_addedでデータを実行し、foreachでデータを実行すると、データはループおよびクエリこの値は未定義ですが、オブジェクトを試してみましたが、最後の値を救済しました。どのようにしてこの問題を解決できますか?ここでFirebaseとJavaScriptを使用してスナップショットをアレイに保存する方法は?

は、コードスニペットです:下部の

var array=[]; 
var ref= firebase.database().ref().child('messages'); 
ref.orderByChild("fecha").on('value',function(snapshot){ 
    snapshot.forEach(function(snap){ 
     //test array 
     array[0] = snap.val().text; 
     console.log(array[0]);//show the data 
    }); 
}); 

//but out of the loop 
console.log(array[0]);//Return undefined 
+0

'on'は非同期で、そのコールバックはあなたのスニペットの最後の' console.log'呼び出しの後まで起動しません。 – cartant

+0

[機能の非同期呼び出し(Firebase)の処理]の可能な複製(http://stackoverflow.com/questions/11636731/handling-asynchronous-calls-firebase-in-functions) – cartant

答えて

3

console.logは、ループ内で前に1を実行します。これは非同期コードと呼ばれます。

APIから返される前に値にアクセスすることはできません。 .on関数は、データが準備されて実行されるのを待ってから実行されるため、データが利用可能になります。

コールバックの外側にあるデータを "保存"する方法はありません。コールバック内にあるデータを知る唯一の場所です。もちろん、コールバックの中から別の関数に渡すことはできますが、2つ目のconsole.logの位置にそれを抽出する方法はありません。

関連する問題