2015-09-19 9 views
6

मेरे पास एक ऐसा फ़ंक्शन है जो वादा करता है।क्या कोई वादा (नकारात्मक) साइड इफेक्ट्स है जब मैं वादा के "तब" फ़ंक्शन का उपयोग नहीं करता हूं?

अब, कभी-कभी उपभोक्ता के लिए उस वादे पर "तत्कालीन" फ़ंक्शन का उपयोग करना समझ में आता है। लेकिन कभी-कभी उपभोक्ता को इस बात की परवाह नहीं है कि वादा कब हल होता है, और परिणाम के बारे में भी नहीं - दूसरे शब्दों में एक ही कार्य को "आग और भूलने" तरीके से भी बुलाया जाना चाहिए।

तो मैं इन दोनों के उपयोग परिदृश्यों हैं:

func().then(...); // process Promise 
func(); // "fire and forget" 

जाहिरा तौर पर काम करता है, लेकिन मुझे आश्चर्य है कि अगर यह, इस प्रयोग के पैटर्न किसी भी अवांछित दुष्प्रभाव हो सकता है अगर "बुरा व्यवहार" माना जाता है, और विशेष रूप से यानी । मेमोरी लीक की ओर अग्रसर? अभी मैं ब्लूबर्ड का उपयोग कर रहा हूं, लेकिन अगर मैं कोई फर्क पड़ता हूं तो मैं मूल वादे में स्विच करने पर विचार करता हूं।

+0

+1 आउटपुट, हालांकि मुझे लगता है कि यह किसी भी कारण होगा न मुद्दा। लेकिन जैसा कि आपने स्मृति रिसाव के बारे में पूछा है .. मुझे जानना उत्सुक है :) – agpt

+1

संभावित डुप्लिकेट [क्या मैं नोडज (ईएस 7) में एक वादा को आग और भूल सकता हूं?] (http://stackoverflow.com/q/32384449/ 1048572) (जो 'async' /' await' वाक्यविन्यास का उपयोग करता है, लेकिन आधार समान है) – Bergi

+0

हां, बर्गि कम से कम समान लगता है - क्षमा करें मुझे उत्तर खोजने के दौरान यह नहीं मिला। केवल अंतर यह है कि मैं हालांकि नोड का उपयोग नहीं कर रहा हूं। –

उत्तर

4

याद रखें कि then पर प्रत्येक कॉल के परिणामस्वरूप एक नया वादा होता है। तो कोई भी वादा कार्यान्वयन जिसमें किसी भी रिज़ॉल्यूशन हैंडलर से जुड़े वादे के परिणामस्वरूप स्मृति रिसाव नहीं था, वह उन सभी वादों के साथ होगा जिन्हें हम कभी भी हैंडलर को वापस नहीं लौटते। मुझे उन इंजनों पर ईएस 6 के मूल वादे पर बहुत संदेह है जहां उन्हें अब तक लागू किया गया है या ब्लूबर्ड के पास यह व्यवहार है।

अलग-अलग, अवधारणात्मक रूप से एक वादे के संकल्प हैंडलर मूल रूप से केवल सरणी या सूची में संग्रहीत कार्य होते हैं और फिर उपयुक्त होने पर बुलाए जाते हैं, यदि आप उन सरणी/सूचियों में कभी भी कोई फ़ंक्शन नहीं डालते हैं तो यह स्मृति रिसाव होने की संभावना नहीं है।

तथ्य यह है कि then एक नया वादा रिटर्न एक आश्चर्य है, पर विचार करें:

let p1 = new Promise(resolve => { 
    setTimeout(() => { 
    resolve('a'); 
    }, 100); 
}); 
let p2 = p1.then(result => { 
    console.log("p1.then got " + result); 
    return 'b'; 
}); 
p2.then(result => { 
    console.log("p2.then got " + result); 
}); 

जो

 
p1.then got a 
p2.then got b 

Live Copy on Babel's REPL

+0

अच्छा तर्क, धन्यवाद! –

+1

मैंने "खराब अभ्यास" भाग को संबोधित नहीं किया क्योंकि यह शायद व्यक्तिपरक है। लेकिन मैं ध्यान दूंगा कि एक फ़ंक्शन के रिटर्न वैल्यू का उपयोग न करना वास्तव में आम है, जो वादा करने के लिए किसी भी हैंडलर को जोड़ने के बराबर गैर-वादा समकक्ष है। –

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