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ですか?

4

2 に答える 2

4

You can try this

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();
        }
    });
};
于 2013-03-12T08:10:16.283 に答える
3

より良いアプローチがあるかもしれませんが、これには$.whenfunction を使用します。これがどのように見えるかの例です:

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/

于 2013-03-12T08:05:38.783 に答える