Ответ 1
Это должно работать:
when = Function.prototype.apply.bind( $.when, null);
Вы просто связываете (или карри, если хотите) первый аргумент .bind
и исправляете его до null
.
Я ищу способ выполнить определенную задачу, а именно:
jQuery.when.apply( null, promiseArray ).done(...)
к
when( promiseArray ).done(...)
Как вы, возможно, знаете, .bind()
может привыкнуть к созданию чего-то вроде аргументов по умолчанию, а также делать довольно неплохие вещи. Например, вместо того, чтобы всегда вызывать
var toStr = Object.prototype.toString;
// ...
toStr.call([]) // [object Array]
мы можем сделать это как
var toStr = Function.prototype.call.bind( Object.prototype.toString );
toStr([]) // [object Array]
Это довольно круто (даже если есть пессимизм производительности, вызывающий .bind()
, как это, я знаю это, и я знаю об этом), но я не могу выполнить его для вызова jQuerys .when
. Если вы получили неизвестное количество объектов обещания, вы обычно вставляете их в массив, чтобы затем передать их в .when
, как в моем первом фрагменте кода выше.
Я делаю это до сих пор:
var when = Function.prototype.apply.bind( $.when );
Теперь мы можем пойти как
when( null, promiseArray ).done(...)
Это работает, но я также хочу избавиться от необходимости проходить в null
явно каждый раз. Поэтому я попробовал
var when = Function.prototype.apply.bind( $.when.call.bind( null ) );
но это бросает меня:
"TypeError: Function.prototype.apply called on incompatible null"
Думаю, я слишком долго сижу над этим и не могу думать прямо. Похоже, что есть простое решение. Я не хочу использовать какую-либо дополнительную функцию для решения этой проблемы, я бы предпочел решение с помощью .bind()
.
См. полный пример здесь: http://jsfiddle.net/pp26L/
Это должно работать:
when = Function.prototype.apply.bind( $.when, null);
Вы просто связываете (или карри, если хотите) первый аргумент .bind
и исправляете его до null
.
bind
принимает переменное количество аргументов, поэтому вы можете частично применить метод. Итак, вместо:
var when = Function.prototype.apply.bind( $.when );
Сделайте это:
var when = Function.prototype.apply.bind( $.when , null );
И обновленный jsfiddle: http://jsfiddle.net/pp26L/2/