2

当等待多个延迟对象完成时,为什么:

$.when(tasks).then(function() {
    document.write("Completed all requests." + "<br/>");
});

立即执行,但

$.when.apply(null, tasks).then(function () {
    document.write("Completed all requests." + "<br/>");
});

等到任务完成。

4

1 回答 1

12

when函数不采用延迟数组。相反,您将每个 deferred 作为单独的参数传递。这正是apply为你做的事情。

null传递给apply只是因为这是期望apply的:第一个参数是函数调用时应该设置的上下文,第二个参数始终是一个数组,它将被扩展以便函数被调用为如果数组中的所有项目都作为单独的参数传入。

因为就它的目的而言,when它被调用的上下文没有任何区别,它的null工作原理和其他任何东西一样好。我更喜欢将 jQuery 本身传递给它:

$.when.apply($, tasks).then(function () {
    // Whatever
});

因为我认为它看起来更干净,但这只是我。它没有任何区别。


如果您的浏览器支持原生 Promise(或者您正在使用polyfill),您可以改用它的all方法,该方法直接采用一组 Promise:

Promise.all(tasks).then(function (values) {
    // "values" is an array, with the results of each of the "tasks"
});
于 2013-01-29T01:47:10.203 回答