function(obj){
for (property in obj) {
if (obj.hasOwnProperty(property)) {
// some code here
if(condition){
obj.children = example.getdata(base, obj.name);
}
// some more code releated to obj
}
}
if (obj.length == 10)
{
//some more function
}
}
现在我想让 example.getdata 异步,但我不想在 for loop 之后执行 if 语句,直到所有同步任务完成。 更像是我希望所有 example.getdata 函数调用并行执行,在完成工作后我执行if(obj.length)。
我尝试使用promises并推送所有promises并解决它们但我不知道如何处理每个函数调用的返回值。
答案 0 :(得分:0)
您可以使用承诺。
想想:
var jobs = get_jobs(data);
when_all(jobs).done(function (jobs_result) {
console.log(jobs_result);
});
get_jobs
返回列表或Promise
时,when_all
将解析其所有输入作业的解析。
答案 1 :(得分:0)
要在循环中串行运行异步任务,不能使用常规for
循环,因为for
循环不会等待异步操作完成后再执行下一个循环环。相反,您必须以稍微不同的方式进行自己的自定义迭代。这是一种方式:
假设你的getdata()
函数实际上是异步的并且有一个完成函数,你可以构造这样的东西:
function myFunc(obj, callback) {
var keys = Object.keys(obj);
var cntr = 0;
var results = [];
function next() {
if (cntr < keys.length) {
example.getdata(obj[keys[cntr++]], function(result) {
// do something with the result of each async operation here
// and put it in the results array
// kick off the next iteration
next();
});
} else {
// call the final callback because we are done now with all async operations
callback(results);
}
}
// start the first iteration
next();
}
如果你的getData函数返回一个promise或者可以返回一个promise,那么你也可以使用promises:
function myFunc(obj) {
var keys = Object.keys(obj);
keys.reduce(function(p, item) {
return p.then(function(result) {
// do something with the result of each async operation here
// and put it in the results array
return example.getdata(obj[item]);
});
}, Promise.resolve());
}
myFunc.then(function(results) {
// all async operations done here, use the results argument
});
答案 2 :(得分:0)
Here is a clean example of a for loop using promises. If you can pick a promise library libraries like Bluebird will make it even simpler:
hide()