2016-01-08 13 views
6
'use strict'; 

Promise.resolve(() => 'John') 
    .then((args) => { 
    console.log(args); 
    throw new Error('ops') 
    }) 
    .catch((ex) => { 
    console.log(ex) 
    }) 
    .then(() => { 
    throw new Error('ups') 
    console.log('Doe') 
    }) 

मुझे लगता है कि console.log(args); उत्पादन 'John' चाहिए, लेकिन जब मैं इस कोड को चलाने के लिए, उत्पादन [ [Function] ]इस वादा कोड को कैसे समझें?

तो मैं उलझन में हूँ है।

+2

मुझे लगता है कि आउटपुट जॉन होना चाहिए, लेकिन इसके बजाय यह '[फंक्शन]' - 'console.log (() => 'जॉन') है) - देखें - मैंने वहां क्या किया? –

+0

'console.log (args());' आउटपुट * जॉन * – cgTag

उत्तर

4

Promise.resolve आपके द्वारा पारित मूल्य के साथ हल किया गया एक नया वादा तैयार करेगा। तो, आपके मामले में, आपका वादा वास्तव में फ़ंक्शन ऑब्जेक्ट के साथ हल हो जाता है। इसका मतलब है कि, then हैंडलर फ़ंक्शन ऑब्जेक्ट को ही पास कर दिया गया है।

तुम क्या करना चाहिए था

new Promise((resolve, reject) => resolve('John')) 
    .then(args => { 
    console.log(args); 
    throw new Error('ops') 
    }) 
    .catch(console.log.bind(console)); 

है अब, आप एक Promise वस्तु का निर्माण कर रहे हैं और आप उस के समाधान कर रहे हैं मूल्य John साथ।


यदि आप चाहते हैं अपने वादा आसानी से एक मूल्य के साथ हल किया जा करने के लिए है, तो समारोह वस्तु पारित लेकिन Promise.resolve कार्य करने के लिए वास्तविक मूल्य ही नहीं भेजी जाती।

Promise.resolve('John') 
    .then(args => { 
    console.log(args); 
    throw new Error('ops') 
    }) 
    .catch(console.log.bind(console)); 

अब, आप एक वादा, मूल्य John के साथ हल किया है और then हैंडलर का समाधान मूल्य John मिल जाएगा।

नोट: यह एक वादा बनाते समय आप आसानी से हल करने के लिए, ताकि आप Promise constructor anti-pattern से बच सकते हैं वास्तविक रास्ता पता की सिफारिश की तरह से।

अगर आप चाहते हैं 'जॉन', आप अपने कॉल में अज्ञात फ़ंक्शन कॉल करने की आवश्यकता()

Promise.resolve(function(){return 'John';}()); 

नोटिस को हल करने

+0

वैकल्पिक रूप से: 'Promise.resolve()। तब (() => "जॉन") .थ ((args) => console.log (args) ... ' – aaaidan

+0

@aaaidan आप 'वादा' कन्स्ट्रक्टर को फ़ंक्शन ऑब्जेक्ट को पास किए बिना नहीं बुला सकते हैं। – thefourtheye

+1

@thefourtheye' (args) => 'और' (ex) => 'को घटाया जा सकता है' args => 'n' ex => ' – mido

1

संकल्प तर्क तत्कालीन संचालक को सीधे पारित करने के लिए प्रयोग किया जाता है }() फ़ंक्शन कॉल।

+0

और यह 'Promise.resolve (' से अलग कैसे है जॉन ') ' –

+0

बेशक इसका परिणाम" तत्काल "के परिणाम पर कोई प्रभाव नहीं पड़ता है, हालांकि, मुझे यकीन है कि यह स्पष्ट है कि हमारे पास एक बेकार कार्य कॉल है जिस तरह से चल रहा है। स्पष्ट रूप से मेरा मुद्दा यह बताता था कि क्या हो रहा है जब ओपी [फंक्शन] देखता है। – activedecay

3
'use strict'; 

Promise.resolve('John') 
    .then((args) => { 
    console.log(args); 
    throw new Error('ops') 
    }) 
    .catch((ex) => { 
    console.log(ex) 
    }) 
    .then(() => { 
    throw new Error('ups') 
    console.log('Doe') 
    }) 

मैं Promise.resolve('John') संशोधित करता हूं, यह काम करता है। कृपया Promise.resolve देखें।

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