gpt4 book ai didi

javascript - Promise 调用成功回调为时已晚

转载 作者:行者123 更新时间:2023-12-03 12:21:23 26 4
gpt4 key购买 nike

我的代码如下:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com