15

我正在寻找一种方法来完成某项任务,也就是说,从

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调用。如果你有一个未知数量的 Promise 对象,你通常将它们推送到一个数组中,然后能够.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/

4

2 回答 2

10

这应该有效:

when = Function.prototype.apply.bind( $.when, null);

您只需绑定(或咖喱,如果您愿意)的第一个参数.bind并将其修复为null.

小提琴

于 2012-04-20T14:10:56.357 回答
7

bind接受可变数量的参数,因此您可以部分应用方法。所以,而不是:

var when = Function.prototype.apply.bind( $.when );

做这个:

var when = Function.prototype.apply.bind( $.when , null );

并更新了 jsfiddle:http: //jsfiddle.net/pp26L/2/

于 2012-04-20T14:11:15.100 回答