【问题标题】:How to loop through an array of asynchronous jobs, and do them respectively?如何循环遍历一组异步作业,并分别执行它们?
【发布时间】:2013-03-12 07:43:05
【问题描述】:

有一系列工作,比如“要求用户填写表格”、“发出 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() 时,我不需要做任何事情,因为 prompt 是同步方法,但异步方法呢?

使用jQuery.Deffered可以做到这一点吗?

【问题讨论】:

  • 您混淆了“同步”和“异步”这两个术语,我为您解决了。
  • @fab 谢谢你,我知道我可能把他们弄糊涂了,因为英语不是我的母语:p

标签: javascript jquery jquery-deferred


【解决方案1】:

你可以试试这个

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();
        }
    });
};

【讨论】:

    【解决方案2】:

    也许有更好的方法,但我会为此使用$.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/

    【讨论】:

    • 这很好,但为什么你在for 中使用匿名函数?顺便说一句,我选择 RaraituL 答案是因为我的情况并不复杂,无法使用 $.Deferred。
    • 我仅用于演示目的,与问题无关。是的,RaraituL 的答案更好,我也更喜欢它,我的答案过于复杂。
    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多