एक वादा के साथ, ब्राउज़र दो बार अस्वीकार क्यों करते हैं लेकिन दो बार संकल्प नहीं?


10

मुझे javaScript समझने में परेशानी हो रही है promises। मैंने निम्नलिखित कोड लिखा है:

var p = new Promise(function(resolve,reject){

    reject(Error("hello world"));
});

setTimeout(()=>p.catch(e=>console.log(e)),5000);

मैं तुरंत अपने Chrome डेवलपर कंसोल में इसे देखता हूं: यहां छवि विवरण दर्ज करें

लेकिन मैं 5 सेकंड प्रतीक्षा करने के बाद, संदेश स्वचालित रूप से इस छवि की तरह काले रंग में बदल जाता है: यहां छवि विवरण दर्ज करें

मैंने अपने javaScript कोड और डेवलपर कंसोल के बीच यह व्यवहार पहले कभी नहीं देखा है, जहाँ मेरा javaScript कोड डेवलपर कंसोल में "मौजूदा सामग्री को संशोधित" कर सकता है।

इसलिए मैंने यह देखने का फैसला किया कि क्या resolveइस कोड को लिखने के साथ भी यही स्थिति है :

var p = new Promise(function(resolve,reject){

    resolve("hello world");
});

setTimeout(()=>p.then(e=>console.log(e)),5000);

लेकिन इस स्थिति में, मेरा डेवलपर कंसोल 5 सेकंड बाद तक कुछ भी नहीं दिखाता है, जिस पर वह प्रिंट करता है hello world

क्यों कर रहे हैं resolveऔर rejectजब वे लागू कर रहे हैं के संदर्भ में तो अलग तरह से व्यवहार?


अतिरिक्त

मैंने यह कोड भी लिखा है:

var p = new Promise(function(resolve,reject){

    reject(Error("hello world"));
});

setTimeout(()=>p.catch(e=>console.log("errors",e)),5000);
setTimeout(()=>p.catch(e=>console.log("errors 2",e)),6000);
setTimeout(()=>p.catch(null),7000);

यह डेवलपर कंसोल के लिए कई आउटपुट का कारण बनता है। समय पर लाल त्रुटि, पाठ के साथ 5 सेकंड के समय में लाल रंग में परिवर्तन errors hello world, फिर समय पर एक नया त्रुटि संदेश 6 सेकंड errors 2 hello world, फिर समय पर लाल त्रुटि संदेश 7 सेकंड। अब मैं बहुत उलझन में हूं कि rejectवास्तव में कितनी बार आह्वान किया जाता है .... मैं खो गया हूं ...


1
बस एक तरफ: var p = new Promise(function(resolve,reject){ reject(Error("hello world")); });अधिक मुहावरेदार और संक्षिप्त रूप से var p = Promise.reject(Error("hello world"));:-) के रूप में लिखा जा सकता है
टीजे क्राउडर

1
बहुत बढ़िया सवाल।
टीजे क्राउडर

जवाबों:


11

वाह, यह वास्तव में अच्छा है। मैंने कंसोल को पहले कभी नहीं देखा था। (यह गतिशील व्यवहार के अन्य रूप हैं, हालांकि, इसलिए ...) यहाँ क्या हो रहा है:

पहले मामले में, आपके setTimeoutकॉलबैक के कोड के बाहर सब कुछ का कोड निष्पादन पूरा हो जाता है और निष्पादन स्टैक वापस आ जाता है ताकि केवल " प्लेटफ़ॉर्म कोड " (जैसा कि वादा / ए + कल्पना इसे कॉल करता है) चल रहा है, उपयोगकर्तालैंड जावास्क्रिप्ट कोड (फिलहाल के लिए) नहीं। उस बिंदु पर, वादा अस्वीकार कर दिया गया है और कुछ भी अस्वीकृति को नियंत्रित नहीं किया गया है, इसलिए यह एक अनहेल्ड अस्वीकृति है और devtools आपको इस तरह से रिपोर्ट करते हैं।

फिर , पांच सेकंड बाद, आपका कॉलबैक चलता है और एक अस्वीकृति हैंडलर संलग्न करता है। इस बिंदु पर, अस्वीकृति अब खंडित नहीं है। जाहिरा तौर पर, Chrome / V8 / devtools कंसोल से अनहेल्ड रिजेक्शन चेतावनी को हटाने के लिए एक साथ काम करते हैं । इसके बजाय आप जो देखते हैं वह वही है जो आप अपने अस्वीकृति हैंडलर में आउटपुट करते हैं console.log। यदि आपने अस्वीकृति हैंडलर को जल्द ही संलग्न किया है, तो आपको वह अनहेल्ड रिजेक्शन त्रुटि नहीं मिलेगी।

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


1
ओह, यह समझ में आता है। मैंने देखा कि फायरफॉक्स इसे थोड़ा अलग तरीके से संभालता है। लेकिन ठीक है, अब और अधिक समझ में आता है।
जॉन

1
मैंने जवाब में सिर्फ वही लिखा, लेकिन एसओ ने आपका लोड किया, इसलिए मैंने अपना पोस्ट नहीं किया। अच्छी व्याख्या! +1
FZs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.