2017-12-24 11 views
0

私は長い間この問題を解決しようとしてきましたが、それを稼働させることはできませんでした。ノードとファイアベースで約束を待つ方法

g_globalList.once("value").then(function(tickList){ 
    var multiPaths = [];  
    tickList.forEach(function(ticker){ 
     ticker.val().forEach(function(path){ 
      multiPaths.push(path); 
     }); 
    }); 
    return multiPaths;   
}).then(function(multiPaths){ 
    var myObj = {}; 
    multiPaths.forEach(function(path){ 
     var ticker = path.substr(path.lastIndexOf("/")+1, 40); 
     console.log("adding " + ticker); 

     ****this is another promise and make my "myObj" to print blank**** 

     db.child("symbols/NSE/" +ticker).once('value').then(function(data){ 
      if(data.exists()){ 
       myObj[path] = data.val(); 
      }  
     }); 
    }); 
    return myObj; 
}).then(function(myObj){ 
    console.log(myObj); 
}); 

すべての約束が完了した後、私は最後に「console.log(myObj)」と呼ぶことができますか?

+0

あなたが使用することができます[プロミス#すべて]( –

答えて

0

forEachの代わりにマルチパスでマップを使用します。各db.child呼び出しを返し、Promise.all()でマップ呼び出しをラップして返します。

+0

残念ながら、Firebaseによって返された 'Snapshot'は' map() 'を実装していません。 –

1

あなたは(私がテストしたが、多分あなたの問題を解決するためにあなたのアイデアを与えるだろうではない)怒鳴る例を確認し、すべての約束は解決待ちのためPromise#allを使用することができます。

var allPaths = []; 

g_globalList.once("value").then(function(tickList){ 
    return Promise.all(
    //map will create a array of the returned values (Promises in this case) 
     tickList.map(function(ticker){ 
      return ticker.val(); 
     }) 
    ); 
}).then(function(values){//values represents all then results 
    allPaths = values; //store for later all paths 
    return Promise.all(
     //map will create a array of returned values (Promises in this case) 
     values.map(function(path){ 

      var ticker = path.substr(path.lastIndexOf("/")+1, 40); 
      return db.child("symbols/NSE/" +ticker).once('value'); 
     }) 
    ); 
}).then(function(values){//values represents all then results 
    var myObj = {}; //now lets create a obj 

    for(var i = 0; i < allPaths.length; i++){ //foreach path 
     var path = allPaths[i]; 
     //get the ticker name again 
     var ticker = path.substr(path.lastIndexOf("/")+1, 40); 

     //check your data 
     var data = values[i]; 
     if(data.exists()){ 
      //add to the obj 
      myObj[path] = data.val(); 
     }  
    } 
    //return the obj 
    return myObj; 
}) 
.then(function(myObj){ 
    //i hope its here now 
    console.log(myObj); 
}); 
関連する問題