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

标签 javascript jquery ajax promise

我的代码如下:

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/

相关文章:

jquery - 如何禁用div中的鼠标滚轮点击?

javascript - 如何稳定 jquery 音量 slider 的声音?

javascript - 使用 jQuery (GET) 下载文件时遇到困难

javascript - Django Forms - 构建一个表单,显示来自多个不同模型的字段,但按外键排序

javascript - 在 Chrome 中绘制文本陷阱

javascript - 在页面之间传递值。我究竟做错了什么?

jQuery 验证器仅允许基本字符

javascript - 在模板页面中显示ajax数据 - Framework7

javascript - AJAX 响应太多

javascript - 仅当 mouseenter 结束时才离开