2012-04-20 8 views
15

मैं एक तरह से एक निश्चित कार्य को पूरा करने के लिए देख रहा हूँ और वह यह है किबचना .call() और .apply() .bind का उपयोग कर()

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

+0

@ रेयानोस: हाँ, मेरे घायल अहंकार में नमक रगड़ें ..: पी – jAndy

उत्तर

10

यह काम करना चाहिए:

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

तुम बस (यदि आप पसंद करते हैं या करी,) बाँध .bind का पहला तर्क और null को इसे ठीक कर।

Fiddle

+0

ओएमजी, मुझे यकीन है कि मैंने कुछ समय पर ऐसा किया था। मैं इसे कैसे याद कर सकता हूं? कम से कम मुझे पता था कि यह एक बड़े सवाल के लिए एक काफी आसान समाधान था। धन्यवाद @ जोन! – jAndy

+0

@jAndy: यह मानते हुए कि आपकी जेएस चॉप मेरी तुलना में काफी बेहतर हैं, यह स्पष्ट है कि थकान के कारण आप इसे याद कर चुके हैं। चीयर्स। – Jon

7

bind तर्कों की एक चर संख्या को स्वीकार करता है, ताकि आप आंशिक रूप से एक विधि लागू कर सकें। तो, के बजाय:

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

यह करें:

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

और अद्यतन jsfiddle: http://jsfiddle.net/pp26L/2/

संबंधित मुद्दे