确保内部延迟完成,然后“然后”

Ensure inner deferred completes before outer "then"

本文关键字:然后 内部 延迟 确保      更新时间:2023-09-26

如果我有 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之前调用外部then

承诺并不神奇,它们不能只知道"工作完成"的时间,他们检查完成的唯一方法是通过返回值。如果你想连锁承诺,你必须从你当时的链条中回来。

在此示例中,您不会从 then 调用返回,因此它不会等待。

此外 - 你不需要用$.when包装常规承诺,$.when所做的是将一个或多个可能的承诺转换为对其价值观的承诺。

$.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
});