有一系列工作,比如说'要求用户填写表格','发出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
?
答案 0 :(得分: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();
}
});
};
答案 1 :(得分: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
作为异步操作。