我有一个类似于下面的结构,我需要按顺序执行:
var task1, task2, task3, last;
initialize = $.when(function(){ ...initializing... }).done(function(){ ..initialization completed.. });
task1 = initialize.when(function(){ ..doing task1.. }).done(function(){ ..task1 completed.. });
task2 = task1.when(function(){ ..doing task2.. }).done(function(){ ..task2 completed.. });
task3 = task2.when(function(){ ..doing task3.. }).done(function(){ ..task3 completed.. });
last = task3.when(function(){ ..doing last.. }).then(function(){ ..last completed.. });
如何使用jQuery-1.10.2执行此操作?
考虑上面的示例,控制台输出将是:
initializing
initialization completed
doing task1
task1 completed
doing task2
task2 completed
doing task3
task3 completed
doing last
last completed
答案 0 :(得分:0)
处理需要执行的异步任务时,您可以使用$.Deferred
对其进行包装,并使用deffered.then()
对其进行链接:
function init() {
console.log("initializing");
}
function doTask1() {
var d = $.Deferred();
console.log("synchronous part of task 1");
setTimeout(function() {
console.log("asynchronous part of task 1");
d.resolve() }, 5000);
return d;
}
function doTask2(resFromTask1) {
var d = $.Deferred();
console.log("task2");
setTimeout(function() {
console.log("asynchronous part of task 2");
d.resolve() }, 5000);
return d;
}
function doLast() {
console.log("last task");
}
$.when(init()).then(doTask1).then(doTask2).done(doLast);
请注意,解析从doLast
返回的deffered时调用doTask2
函数。因此,如果我们想要在doTask1
之后但在doTask2
之前运行同步函数,则需要像这样添加:
$.when(init()).then(doTask1).done(function() {
console.log("new synchronous function");
}).then(doTask2).done(doLast);
现在,当doTask2
的延迟对象被解析时,doTask1
和匿名函数都会运行。如果匿名函数移到doTask2
之后:
$.when(init()).then(doTask1).then(doTask2).done(function() {
console.log("new synchronous function");
}).done(doLast);
然后,当从doLast
返回的延迟对象完成时,匿名函数和doTask2
函数都将运行。