繁体   English   中英

jQuery延迟回调的序列

[英]sequence of jQuery deferred callbacks

如果我有类似的东西

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

是否保证callback3将在callback1callback2之后运行? (前两个回调可以以任何顺序运行,具体取决于基础的AJAX完成。)

在某些有限的测试中似乎是这种情况,但它总是真实的还是巧合的? 换句话说, done返回一个新的promise,该新的promise将在回调完成时解决?

是。 保证回调(按单个承诺)将以附加的顺序运行。 至少在规范规定本作then ,虽然jQuery的不遵循[全部]规范Callbacks对象是这样实现的。

但是,您永远不必依赖于此。 如果callback3确实取决于先前的回调的结果(操作),则应如此明确地声明。 您可以使用then方法 (以前称为pipe )为回调的结果创建promise:

$.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);

如果callback1callback2不执行任何异步操作(例如,其他ajax请求或动画),则可以使用您的代码,并知道在使用现有代码执行callback3之前, callback1和2将始终是完整的,您可以放心使用。 但是,如果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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM