2013-07-31 4 views
15

मुझे सभी तर्कों को पार करने में समस्या हो रही है। मेरा वादा कॉलबैक केवल तीन के बजाय प्राप्त करता है:जावास्क्रिप्ट वादा सभी तर्कों को पार नहीं कर रहा है (क्यू का उपयोग करके)

var asyncFunction= function(resolve) { 
    setTimeout(function() { 
     resolve("Some string that is passed", "and another", "third"); 
    }, 1000); 
}; 

var promiseFunction = function() { 
    var deferred = Q.defer(); 

    asyncFunction(deferred.resolve); 

    return deferred.promise; 
}; 

promiseFunction().then(function() { 
    // Only one argument is passed here instead of 3 
    // { '0': 'Some string that is passed' } 
    console.log(arguments); 
}); 

कोई विचार क्या मैं गलत कर रहा हूं?

+0

मेरा पैसा प्रकार के दबाव पर है –

उत्तर

12

क्यू वादे resolve डी केवल एक तर्क के साथ हो सकता है - एक वादा एक एकल मूल्य के लिए है, न कि उनके संग्रह के लिए। यदि आपको कई मानों की आवश्यकता है तो उन्हें स्पष्ट रूप से सरणी में रखें। एकाधिक-पैरामीटर-कॉलबैक के लिए, आप .spread() का उपयोग कर सकते हैं।

+1

यह कैसे संभव है? वहाँ एसिंक कार्यों के साथ हजारों पुस्तकालय हैं जो कई तर्क लौटाते हैं? तब उनका उपयोग नहीं किया जा सकता है? – Nick

+0

केवल एक रैपर के साथ ऐसा लगता है। क्या आपके मन में कोई खास व्यक्ति है? – Bergi

+0

@Nick पूरी लाइब्रेरी एकल मान दृष्टिकोण के आसपास केंद्रित है। [स्रोत को देखें] (https://github.com/kriskowal/q/blob/424dbd1f8c4a6a40a4b2c341598955b3880bfe79/q.js#L571) और यह पता लगाने का प्रयास करें कि एकाधिक मानों का समर्थन करने के लिए किन परिवर्तनों की आवश्यकता होगी। आप आश्चर्यचकित होंगे कि कम या कोई वास्तविक मूल्य लौटने पर यह कितना जटिल हो जाता है। बर्गि के सुझाव के रूप में, एक सरणी का प्रयोग करें। – Tomalak

2

सिंक्रोनस फ़ंक्शन केवल एक मान लौटाते हैं, वैसे ही एसिंक्रोनस को एक के साथ हल करना चाहिए।

कई मूल्यों के साथ हल होने वाले एसिंक फ़ंक्शन बनाने के लिए यह एक खराब प्रथा है। यदि आप कई मानों को पारित करना चाहते हैं, तो उन्हें सरणी या dict ऑब्जेक्ट में वापस कर दें, जैसा कि आप करेंगे, यदि दिया गया कार्य सिंक्रोनस होगा।

+1

कॉलबैक का उपयोग करके पुस्तकालयों के बहुत सारे कई तर्क वापस पास करते हैं; मैं इस बुरे अभ्यास पर विचार नहीं करता हूं। कई मूल्यों का समर्थन करने वाले वादे/वायदा भी एक तार्किक कदम की तरह लगते हैं। मुझे लगता है कि यह खोजा जाना चाहिए, जैसा कि यह [मेलिंग सूची प्रविष्टि] (http: //lists.w3 है।org/अभिलेखागार/सार्वजनिक/www-डोम/2013AprJun/0059.html)। – Matt

+0

मैट, शुरुआत में लाइब्रेरी में मैं बनाए रखता हूं मैंने संकल्प के लिए कई मानों के भत्ते के साथ प्रयोग किया, लेकिन मैंने तुरंत उस विचार को खारिज कर दिया। मुझे अब सटीक मुद्दों को याद नहीं है, लेकिन मेरा मानना ​​है कि ऐसे मामले थे जब मुझे एक वस्तु के रूप में हल किए गए मूल्य से निपटने की आवश्यकता थी, और यह एक अजीब या तर्क वस्तु से निपटने के लिए अजीब था (और सिंक फ़ंक्शंस के बराबर नहीं) । निर्णय पहले से ही तैयार किया गया है और अभ्यास में सही साबित हुआ है। आपके द्वारा देखे गए पोस्ट को तुरंत हटा दिया गया था। मुझे इस विचार को गंभीरता से नहीं माना जाता है। –

+0

मुझे केवल इसलिए ख्याल है क्योंकि मैं एक वादे लाइब्रेरी (मज़ेदार और सीखने के लिए) लिख रहा हूं और कई हल करने वाले तर्क मेरे लिए ऐसे प्राकृतिक समाधान की तरह महसूस करते हैं। यदि समुदाय एक ही मूल्य पर बस गया है, तो मुझे लगता है। पालन ​​करने के लिए धन्यवाद। – Matt

0

यदि आप कई मानों के साथ पास करना चाहते हैं, तो आपको उन्हें एक अन्य एकल मान में लपेटना होगा, जैसे कि सरणी या ऑब्जेक्ट।

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