我的代码如下:
products.SaveApplications = function (product) {
var promises = [];
ko.utils.arrayForEach(product.Applications(), function (item) {
var applicationToSend = ko.mapping.toJS(item);
promises.push($.ajax({
type: "POST",
contentType: "application/json",
url: serviceUrl + "/InsertApplication",
data: JSON.stringify(applicationToSend),
success: function (data) {
alert("Doing success callback now.");
item.ID(data);
}}));
});
return promises;
}
然后是一个函数products.SaveEnvironments
,它基本上是相同的,除了它在我的 Controller 中调用不同的函数之外,还有一个函数products.SaveInstallations
,它是,同样,大部分相同,只是它需要等待环境和应用程序保存,因为它有一些依赖数据(Application.ID和Environment.ID)。
现在我有一个函数,它调用这两个函数并等待它们直到两个函数都完成:
products.SaveChanges = function (product) {
// (...)
var promises = products.SaveApplications(product);
promises = promises.concat(products.SaveEnvironments(product));
$.when(promises).done(function () {
alert("we shouldn't see this before the other message!");
products.SaveInstallations(product);
});
};
问题是警告框显示“我们不应该在其他消息之前看到此消息!”实际上出现在“现在执行成功回调”之前,这意味着我的ID属性当时为空。这让我得出这样的结论: $.when
调用仅执行实际的 promise ,但不会等待成功回调完成。我怎样才能让它等待?谢谢。
最佳答案
您正在使用$.when
错误地。你不能将多个 Promise 作为数组传递给它;如果你这样做,它会像对待任何其他非 promise 值一样对待该数组,并将其转换为已完成的 promise ,并将仍待处理的 promise 的数组作为其结果。当然,这没有用。
您需要使用 .apply
来模拟调用 $.when
并将每个 Promise 作为单独的参数,如下所示:
$.when.apply(null, promises).done(function () { ... });
关于javascript - Promise 调用成功回调为时已晚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24427530/