JQuery Chaining Deferreds没有回调金字塔

时间:2013-03-15 23:21:32

标签: jquery callback jquery-deferred

有没有办法链接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,完成

感谢。

2 个答案:

答案 0 :(得分: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') });

答案 1 :(得分: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')});