2017-06-19 5 views
5

मैं की तरह एक .then समारोह को सीधे Promise.all पास करना चाहते हैं:सीधे क्यों चल रहा है। एक .then फ़ंक्शन को एक त्रुटि फेंकता है?

const test = [ 
    Promise.resolve(), 
    Promise.resolve(), 
    Promise.resolve(), 
    Promise.resolve() 
]; 

Promise.resolve(test) // It's supposed to be an AJAX call 
.then(Promise.all) // Get an array of promises 
.then(console.log('End'); 

लेकिन इस कोड एक त्रुटि Uncaught (in promise) TypeError: Promise.all called on non-object फेंकता है।

जब मैं आशुलिपि वाक्यविन्यास निकालने के लिए, यह काम करता है:

Promise.resolve(test) 
.then(queries => Promise.all(queries)) 
.then(console.log('End')); 

तो क्यों एक Promise.all एक .then को सीधे पारित कर एक त्रुटि फेंकता है? (और क्यों एक console.log ठीक काम करता है?)

उत्तर

4

आप Promise.all.bind(Promise)

बाध्य करने के लिए ES2015 spec से की जरूरत है:

सभी कार्य अपने इस मान के लिए निर्माता समारोह है कि के पैरामीटर सम्मेलनों का समर्थन करता है होना करने के लिए वादा कन्स्ट्रक्टर।

या बेहतर सरणी पर इसका उपयोग करें।

const test = [ 
 
    Promise.resolve(1), 
 
    Promise.resolve(2), 
 
    Promise.resolve(3), 
 
    Promise.resolve(4) 
 
] 
 

 
Promise.resolve(test) 
 
    .then(Promise.all.bind(Promise)) 
 
    .then(x => console.log(x)) 
 
    
 
Promise.all(test) 
 
    .then(x => console.log(x))

+0

क्यों? (मैं इसे सीधे सरणी पर उपयोग नहीं कर सकता, यह सरणी अजाक्स कॉल से आती है, मैं अपना प्रश्न अपडेट करूंगा) – RChanaud

+0

@RChanaud [Spec] (https://tc39.github.io/ecma262/2017/#sec- वादा.ल) ऐसा कहता है "चलो सी यह मान हो। यदि टाइप (सी) ऑब्जेक्ट नहीं है, तो टाइप टाइपर अपवाद फेंक दें।" " सभी फ़ंक्शन को यह मान एक कन्स्ट्रक्टर फ़ंक्शन होने की आवश्यकता है जो वादा कन्स्ट्रक्टर के पैरामीटर सम्मेलनों का समर्थन करता है।" –

+2

@RChanaud मुझे संदेह है कि आपका AJAX अनुरोध जादुई रूप से वादे देता है। तो अभी भी एक जगह है जहां आप 'फिर' कॉलबैक के अंदर वादे का एक सरणी बनाते हैं ताकि आप सरणी –

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