jQuery延迟回调的序列

时间:2013-09-19 18:07:49

标签: javascript jquery deferred

如果我有类似

的话
var promise1 = $.ajax(...).done(callback1);
var promise2 = $.ajax(...).done(callback2);
$.when(promise1, promise2).done(callback3);

是否可以确保callback3callback1callback2运行? (前两个回调可以按任意顺序运行,具体取决于底层的AJAX完成。)

在一些有限的测试中似乎就是这种情况,但这是真的还是巧合?换句话说,done是否会返回在回调结束时解析的新承诺?

2 个答案:

答案 0 :(得分:0)

是。回调(每个承诺)保证按照它们所附加的顺序运行。至少spec dictates this for then,而jQuery不遵循[全部]规范the Callbacks objects是这样实现的。

但是,你永远不需要依赖于此。如果callback3确实取决于先前回调的结果(操作),则应明确说明。您可以使用then method(以前为pipe)为回调结果创建承诺:

$.when(
    $.ajax(…).then(callback1),
    $.ajax(…).then(callback2)
).done(callback3);

// more explicit:

var ajax1 = $.ajax(…),
    ajax2 = $.ajax(…),
    ajaxAndAction1 = ajax1.then(callback1),
    ajaxAndAction2 = ajax2.then(callback2),
    everything = $.when(ajaxAndAction1, ajaxAndAction2);
everything.done(callback3);

答案 1 :(得分:0)

如果callback1callback2没有执行任何异步操作(例如进一步的ajax请求或动画),您可以使用您的代码,并且知道callback1和2 {在使用现有代码执行callback3之前,将始终完成。但是,如果callback1和/或callback2执行进一步的异步操作,则如果要等到进一步的异步操作完成,则需要使用.then

function callback1 (data) {
    return $.ajax(...);
}
function callback2 (data) {
    return $.ajax(...);
}
var promise1 = $.ajax(...).then(callback1);
var promise2 = $.ajax(...).then(callback2);
$.when(promise1,promise2).done(callback3);