在循环中制作异步JavaScript任务

时间:2015-05-12 15:49:48

标签: javascript asynchronous promise

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并解决它们但我不知道如何处理每个函数调用的返回值。

3 个答案:

答案 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()