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){...`
我正在尝试将 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, whileapply()
accepts a single array of arguments.
在您的情况下,您传递的是一个数组,而数组本身不是一个承诺,因此使用 call()
将导致 $.when
立即解析。
使用 apply()
会将数组中的所有承诺分散到单独的参数中......每个参数都必须在 $.when
被解析之前解析
由于所有现代浏览器现在都支持 Promise
API,您也可以这样做:
Promise.all(this.xhrs).then(function(allResults){...`