2013-03-12 37 views
3

有工作上的一个阵列,说“要求用户填写表单”,“问题一个Ajax请求”等如何遍历异步作业数组,并分别执行它们?

我需要运行这些工作一个接一个,最后调用complete()方法。

喜欢的东西:

var jobs = [11, 22, 33, 44, ...]; 

for(var i = 0; i < jobs.length; i++) { 
    alert('Starting job #' + i); 

    // chooseJobOperator shows a form and wait for user to <select> a member 
    // and click save <button> 
    async(chooseJobOperator(jobs[i])); 

    alert('Job #' + i + ' is done, now for-loop will continue'); 
} 

alert('All jobs are done now.'); 
complete(); 

当我的工作是例如显示prompt()我不需要做任何事情,因为提示是同步的方法,但对于异步方法?

使用jQuery.Deffered可以这么做吗?

+0

你感到困惑的术语 “同步” 和 “异步”,我固定它。 – 2013-03-12 08:35:46

+0

@fab谢谢你,我知道我可能会困惑他们,因为英语不是我的母语:p – 2013-03-12 10:22:45

回答

4

你可以试试这个

var jobs = [11, 12, 14, 15]; 
function doTheJob() { 
    if (jobs.length === 0) { 
     alert('All jobs are done now.'); 
     complete(); 
     return; 
    } 

    var job_Id = jobs.pop(); 
    $.ajax({ 
     url: "/DoTheJob", 
     complete: function() { 
      doTheJob(); 
     } 
    }); 
}; 
3

也许有更好的办法,但我会用$.when这个函数。下面是它如何看起来的一个例子:

var jobs = [1, 2, 3]; 

var d = $.Deferred(), 
    stack = []; 

for (var i = 0; i < jobs.length; i++) { 
    stack.push(async(jobs[i])); 
} 

$.when.apply($, stack).done(function() { 
    alert('All done'); 
}); 

function async(type) { 
    alert('Starting job #' + type); 
    return $.Deferred(function() { 
     var self = this; 
     setTimeout(function() { 
      alert('Job #' + type + ' is done'); 
      self.resolve(); 
     }, 1000 * type); 
    }); 
} 

我用setTimeout作为异步操作。

http://jsfiddle.net/rs3Qv/1/

+0

这很好,但你为什么在'for'中使用匿名函数呢?顺便说一句,我选择RaraituL的答案,因为我的情况并不复杂使用$ .Deferred。 – 2013-03-12 11:57:34

+0

我仅将它用于演示目的,它与问题无关。是的,RaraituL的答案是更好的,我也会提出这个意见,我的意见过于完善。 – dfsq 2013-03-12 11:59:49