3

コールバック ピラミッドなしで JQuery Deferreds をチェーンして次々に実行する方法はありますか?

今、私はこのようなことをしなければなりません:

$.Deferred(function(dfd) {
    setTimeout(function() { 
        console.log('Foo'); 
        dfd.resolve(); 
    }, 1000);
})
.done(function() {
    $.Deferred(function(dfd) { 
        console.log('Bar');
        dfd.resolve();
    }).done(function() { 
         console.log('done');
    });
});

出力: Foo、Bar、完了

私はこのようなことができるようにしたい:

$.Deferred(function(dfd) {
    setTimeout(function() { 
        console.log('Foo'); 
        dfd.resolve(); 
    }, 1000);
})
.then($.Deferred(function(dfd) { 
    console.log('Bar');
    dfd.resolve();
}))
.done(function() { console.log('done') });

望ましくない出力: Bar、Foo、完了

ありがとう。

4

2 に答える 2

1

コードの問題は.then()、jQueryオブジェクトを渡しているのに対し、それはを期待していることですfunction。このコードは、必要に応じてfoo-bar-doneを実行します。

$.Deferred(function(dfd) {
    setTimeout(function() { 
        console.log('Foo'); 
        dfd.resolve(); 
    }, 1000);
}).then(function(){ 
    return $.Deferred(function(dfd) { 
         console.log('Bar');
         dfd.resolve();
     });
}).done(function() { console.log('done') });
于 2013-03-15T23:54:01.483 に答える
0

$.when()を使いたいと思います。

このようなものが動作するはずです:

var d1 = $.Deferred(function(dfd) {
    setTimeout(function() { 
        console.log('Foo'); 
        dfd.resolve(); 
    }, 1000);
});

var d2 = $.Deferred(function(dfd) { 
    setTimeout(function() { 
      console.log('Bar');
      dfd.resolve();
    }, 2000);
});

$.when(d1, d2).then(function() {console.log('done')});
于 2015-01-21T22:16:45.613 に答える