[英]jQuery Deferred - Add callbacks to the Deferred contract at runtime
[英]sequence of jQuery deferred callbacks
如果我有类似的东西
var promise1 = $.ajax(...).done(callback1);
var promise2 = $.ajax(...).done(callback2);
$.when(promise1, promise2).done(callback3);
是否保证callback3
将在callback1
和callback2
之后运行? (前两个回调可以以任何顺序运行,具体取决于基础的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);
如果callback1
和callback2
不执行任何异步操作(例如,其他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.