【问题标题】:Waiting for multiple deferred objects to complete等待多个延迟对象完成
【发布时间】:2013-01-29 01:46:22
【问题描述】:
当等待多个延迟对象完成时,为什么会这样:
$.when(tasks).then(function() {
document.write("Completed all requests." + "<br/>");
});
立即执行,但
$.when.apply(null, tasks).then(function () {
document.write("Completed all requests." + "<br/>");
});
等待任务完成。
【问题讨论】:
标签:
javascript
jquery
jquery-deferred
【解决方案1】:
when 函数不采用延迟数组。相反,您将每个 deferred 作为单独的参数传递。这正是apply 正在为你做的事情。
null 被传递给 apply 只是因为这是 apply 所期望的:第一个参数是函数的上下文在调用时应该设置的内容,第二个参数始终是一个数组,它将被扩展,以便调用该函数,就好像数组中的所有项目都已作为单独的参数传入一样。
因为对于when 而言,调用它的上下文没有区别,null 的工作原理与其他任何东西一样好。我更喜欢将 jQuery 本身传递给它:
$.when.apply($, tasks).then(function () {
// Whatever
});
因为我认为它看起来更干净,但这只是我。没有任何区别。
如果您的浏览器支持原生 Promise(或者您正在使用 a polyfill),您可以改用其 all 方法,该方法直接采用一组 Promise:
Promise.all(tasks).then(function (values) {
// "values" is an array, with the results of each of the "tasks"
});