如何等待在节点和firebase中完成的承诺
我一直试图解决这个问题很长一段时间,但无法让它工作。
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)”吗?
回答如下:您可以使用Promise#all等待所有Promises解析,请查看下面的示例(我没有测试但可能会给您一个解决问题的想法):
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);
});
如何等待在节点和firebase中完成的承诺
我一直试图解决这个问题很长一段时间,但无法让它工作。
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)”吗?
回答如下:您可以使用Promise#all等待所有Promises解析,请查看下面的示例(我没有测试但可能会给您一个解决问题的想法):
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);
});