如果我有一个2个嵌套的延迟对象而我正在等待两个完成,我怎样才能确保他们的then
在外部then
触发器之前完成?
$.when($.ajax({
method: 'PUT',
url: someURL,
data: {
// My data
},
callback: function(r) {
var deferred1 = $.Deferred();
var deferred2 = $.Deferred();
$.ajax({
method: 'PUT',
url: url1,
data: {
// My data
}
}).complete(deferred1.resolve);
$.ajax({
method: 'PUT',
url: url2,
data: {
// My data
}
}).complete(deferred2.resolve);
$.when(deferred1, deferred2).then(function() {
self.parent.container.dialog('close').remove();
self.parent.configurator.container.dialog('close').remove();
});
},
})).then(function() {
// Some work; e.g. close a loading spinner
});
使用上面的代码,在deferred1
和deferred2
被解析后,外部then
在内部then
之前被称为
答案 0 :(得分:2)
承诺并不神奇,他们只能知道"工作何时完成",他们检查完成的唯一方法是通过返回值 。如果你想链接承诺,必须从当时的链中返回。
在这个示例中,您没有从当时的通话中返回,所以它不会等待。
此外 - 您不需要使用$.when
包含常规承诺,$.when
将一个或多个可能承诺转换为承诺值。
$.ajax({
method: 'PUT',
url: someURL,
data: {
// My data
},
}).then(function(result){
var p1 = $.ajax({ // $.ajax already returns a promise
method: 'PUT',
url: url1,
data: {
// My data
}
})
var p2 = $.ajax({
method: 'PUT',
url: url2,
data: {
// My data
}
});
return $.when(p1, p2);
}).then(function() {
self.parent.container.dialog('close').remove();
self.parent.configurator.container.dialog('close').remove();
}).then(function() {
// some action
});