2012-04-20 67 views
15

我正在尋找一種方式來完成特定任務,那就是,從使用.bind避免.CALL()和。適用()()

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/

+1

'.bind($。當,空)'? – Raynos 2012-04-20 14:10:43

+0

@Raynos:好的,把鹽揉進我受傷的自我。:p – jAndy 2012-04-20 14:18:21

回答

10

這應該工作:

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

你只綁定(或咖喱,如果你喜歡)的.bind的第一個參數,並將其固定到null

Fiddle

+0

omg,我很確定我在某個時候做到了。我怎麼會錯過它?至少我知道這對於一個大問題是一個相當簡單的解決方案。謝謝@Jon! – jAndy 2012-04-20 14:13:12

+0

@jAndy:考慮到你的JS印章比我的要好得多,很明顯你會因爲疲勞而錯失良機。乾杯。 – Jon 2012-04-20 14:14:31

7

bind接受可變數量的參數,因此您可以部分應用方法。所以,相反的:

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

這樣做:

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

和最新的jsfiddle:http://jsfiddle.net/pp26L/2/