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 は、返された defered が解決されるときに呼び出されることに注意してくださいdoTask2。たとえば、同期関数を後で実行したい場合は、次のように追加する必要がありますdoTask1doTask2

$.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 に答える