1

我有一个如下结构,我需要按顺序执行:

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
4

1 回答 1

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函数 get 是在解析返回的延迟时调用的doTask2。因此,例如,如果我们想在之后doTask1但之前运行一个同步函数,doTask2则需要像这样添加它:

$.when(init()).then(doTask1).done(function() { 
       console.log("new synchronous function"); 
   }).then(doTask2).done(doLast);

现在,当' 的延迟对象被解析时,doTask2和匿名函数都会运行。doTask1如果匿名函数移到 after doTask2

$.when(init()).then(doTask1).then(doTask2).done(function() { 
       console.log("new synchronous function"); 
   }).done(doLast);

然后匿名函数和doLast函数都将在从返回的延迟对象doTask2完成时运行。

于 2013-09-24T17:57:36.977 回答