确保内部延迟在外部 "then" 之前完成
Ensure inner deferred completes before outer "then"
如果我有 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
在 内部的 [=] 之前被调用 12=]
Promise 并不神奇,它们不能只知道何时 "work is done",它们检查完成的唯一方法是通过 return value .如果你想链接承诺,你 必须 return 来自你的 then 链。
在这个例子中,你没有从 then 调用中 returning,所以它不会等待。
此外 - 您不需要用 $.when
包装常规承诺,$.when
所做的是将一个或多个 maybe 承诺 转换为承诺他们的价值观。
$.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
});
如果我有 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
在 内部的 [=] 之前被调用 12=]
Promise 并不神奇,它们不能只知道何时 "work is done",它们检查完成的唯一方法是通过 return value .如果你想链接承诺,你 必须 return 来自你的 then 链。
在这个例子中,你没有从 then 调用中 returning,所以它不会等待。
此外 - 您不需要用 $.when
包装常规承诺,$.when
所做的是将一个或多个 maybe 承诺 转换为承诺他们的价值观。
$.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
});