确保内部延迟在外部“然后”之前完成

时间:2016-02-04 22:27:46

标签: javascript jquery promise jquery-deferred

如果我有一个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之前被称为

1 个答案:

答案 0 :(得分:2)

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

在这个示例中,您没有从当时的通话中返回,所以它不会等待。

此外 - 您不需要使用$.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
});