有3个功能,第一个是我的承诺。
fnGetIps : function () {
return new Promise(function(resolve, reject) {
var err = [], path = getBaseUrl();
restGet(path + NAMES, function (res, edges) {
if (res === undefined) {
reject("Unable to get data");
} else {
resolve(edges);
}
});
});
},
第二个是我使用我的诺言。
fnGetData: function(obj){
var promise_holder;
for (property in obj) {
if (obj.hasOwnProperty(property)) {
if(condition){
promise_holder = fngetip();
}
if(condition2){
//some other code
}
}
}
promise_holder.then(function (ifChildren) {
obj.children = ifChildren;
}, function (err) {
console.error(err);
});
}
最后是一个我调用fnGetData
的函数 TopoTree : function(children) {
var treeArray;
for (i = 0; i < children[i]; i++) {
fnGetData(children[i]);
}
treeArray.push(treeData);
return treeArray;
},
我不想在TreeArray
的所有承诺得到解决之前返回fnGetData
。
如何等待所有承诺先解决,然后返回数据?
我无法使用promise.All
,因为我在promise_holder
范围内没有topotree
,或者我在错误的方向思考?
答案 0 :(得分:2)
你想要Promise.all()
。
让fnGetData
返回promise_holder
并让TopoTree
将它们收集到一个数组中,然后将完成逻辑放在Promise.all()
之后的then函数中
fnGetData: function(obj){
var promise_holder;
for (property in obj) {
if (obj.hasOwnProperty(property)) {
if(condition){
promise_holder = fngetip();
}
if(condition2){
//some other code
}
}
}
// RETURN THE PROMISE HERE!
return promise_holder.then(function (ifChildren) {
obj.children = ifChildren;
// Return a value for use later:
return ifChildren;
});
}
TopoTree : function(children) {
var promises = [];
for (i = 0; i < children.length; i++) {
promises.push(fnGetData(children[i]));
}
// We are handling the result / rejections here so no need to return the
// promise.
Promise.all(promises)
.then(function(treeArray) {
// Do something with treeArray
})
.catch(function(error) {
console.log(error);
});
},