确保内部延迟在外部 "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
});

使用上面的代码,当 deferred1deferred2 被解析时,外部的 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
});