jQuery $.when 立即开火

jQuery $.when Firing Immediately

我正在尝试将 AJAX 个调用一起进行批处理,以便在它们全部完成后获得一个事件:

this.xhrs.push($.ajax({ type: "POST", url: this.options.firstUrl, data: this.options.data, datatype: 'json' }));
this.xhrs.push($.ajax({ type: "POST", url: this.options.secondUrl, data: this.options.data, datatype: 'json' }));
this.xhrs.push($.ajax({ type: "POST", url: this.options.thirdUrl, data: this.options.data, datatype: 'json' }));
this.xhrs.push($.ajax({ type: "POST", url: this.options.fourthUrl, data: this.options.data, datatype: 'json' }));

$.when
    .call($, this.xhrs)
    .done(function(first, second, third, fourth) {
        ...[process data]...

        this.loading.hide();
        this.map.fitBounds(this.bounds);
        this.map.setZoom(this.map.getZoom() - 1);
    }.bind(this));

但是该函数会立即被调用,我也尝试过 .then 而不是 .done 但它也会立即触发。

绝对不是因为 AJAX 调用 return 太快以至于没有注意到,因为其中一个 return 数据需要 20 秒。

我做错了什么?

您想使用 $.when.apply() 而不是 $.when.call()


摘自Function.prototype.call() docs

... fundamental difference is that call() accepts an argument list, while apply() accepts a single array of arguments.


在您的情况下,您传递的是一个数组,而数组本身不是一个承诺,因此使用 call() 将导致 $.when 立即解析。

使用 apply() 会将数组中的所有承诺分散到单独的参数中......每个参数都必须在 $.when 被解析之前解析


由于所有现代浏览器现在都支持 Promise API,您也可以这样做:

Promise.all(this.xhrs).then(function(allResults){...`