如果我有类似
的话var promise1 = $.ajax(...).done(callback1);
var promise2 = $.ajax(...).done(callback2);
$.when(promise1, promise2).done(callback3);
是否可以确保callback3
和callback1
后callback2
运行? (前两个回调可以按任意顺序运行,具体取决于底层的AJAX完成。)
在一些有限的测试中似乎就是这种情况,但这是真的还是巧合?换句话说,done
是否会返回在回调结束时解析的新承诺?
答案 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)
如果callback1
和callback2
没有执行任何异步操作(例如进一步的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);