Ожидание завершения нескольких отложенных объектов

При ожидании завершения нескольких отложенных объектов, почему:

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

выполнить немедленно, но

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

ждет, пока задачи не будут завершены.

Ответ 1

Функция when не принимает массив отложенных событий. Скорее, вы передаете каждый отложенный в качестве отдельного аргумента. Именно это делает apply.

Передача null в apply происходит только потому, что ожидаемый apply: первый аргумент - это то, что должен быть установлен контекст функции при его вызове, а второй аргумент всегда является массивом, который будет расширен так, что функция будет вызываться так, как если бы все элементы массива были переданы в виде отдельных аргументов.

Так как для when не имеет значения, какой контекст, с которым он вызван, null работает так же хорошо, как и все остальное. Я предпочитаю передать его самому jQuery:

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

поскольку я думаю, что он выглядит чище, но это только я. Это не имеет никакого значения.


Если ваш браузер поддерживает собственный promises (или вы используете a polyfill), вы можете использовать его метод all вместо этого, который непосредственно принимает массив promises:

Promise.all(tasks).then(function (values) {
    // "values" is an array, with the results of each of the "tasks"
});