jquery在完成时完成链接等等......当时

时间:2013-09-24 17:51:50

标签: javascript jquery

我有一个类似于下面的结构,我需要按顺序执行:

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

1 个答案:

答案 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函数都将运行。