console.log(1);
let p = Promise.resolve(2);
p.then(val => console.log(val));
console.log(3);

उपरोक्त कोड 1 3 2 प्रिंट करता है, लेकिन चूंकि वादा समाधान समकालिक रूप से किया जाता है, क्या कॉलबैक भी समकालिक रूप से निष्पादित नहीं होना चाहिए? क्या कोई इस व्यवहार की व्याख्या कर सकता है?

0
debapam 27 मार्च 2018, 16:02

3 जवाब

सबसे बढ़िया उत्तर

कोड जो .then में निष्पादित होता है, वादे के कॉलबैक हमेशा अतुल्यकालिक होते हैं।

वादे के अंदर का कोड अतुल्यकालिक नहीं है।

console.log(1);
let p = new Promise((res, rej) => {
	console.log('sync');
	res(2);
});
p.then(val => console.log('async  ' +val));
console.log(3);
0
Willem van der Veen 27 मार्च 2018, 13:16

जावास्क्रिप्ट सिंगल थ्रेडेड (ज्यादातर) है। जेएस को स्केल करने की अनुमति देने के लिए यह कोड के अतुल्यकालिक निष्पादन पर बहुत अधिक निर्भर करता है। तो एक फोन कॉल करने की कल्पना करें, आप एक प्रश्न पूछते हैं, पंक्ति के दूसरे छोर पर व्यक्ति को उत्तर देखना है, इसलिए आप प्रतीक्षा करें। हर समय आपकी प्रतीक्षा में आप कुछ नहीं कर रहे हैं। यह आपके समय की बर्बादी है।

अब वही काम करने की कल्पना करें लेकिन इस बार आप पंक्ति के दूसरे छोर पर मौजूद व्यक्ति से कहें कि वह आपको बताए कि उन्हें उत्तर कब मिलेगा। तुम रुको और कुछ और करो। जब दूसरा व्यक्ति समाप्त कर लेता है तो वे आपको आपके प्रश्न का उत्तर देने के लिए वापस बुलाते हैं। यह आपके समय का अधिक कुशल उपयोग है।

आपके कोड में वादा है कि आप फोन कर रहे हैं। then वह व्यक्ति है जिसे आपने कॉल किया है और परिणाम आने पर आपको वापस कॉल किया है और आपका (कॉल करने वाला व्यक्ति) Js थ्रेड है।

तो तुम करते हो:

//1
console.log(1);

फिर आप किसी को (वादा) बुलाते हैं और उनसे कुछ काम करने के लिए कहते हैं:

let p = Promise.resolve(2); //nothing printed here

वे कहते हैं कि वे आपको वापस बुलाएंगे:

.then(...) //nothing printed here

आप दूसरे काम करते हैं

//3
console.log(3);

वे आपको वापस बुलाते हैं:

//2
val => console.log(val)

1
3
2

लेकिन चूंकि वादा समाधान समकालिक रूप से किया जाता है

नहीं, यह वादे नहीं हैं aतुल्यकालिक रूप से हल किए जाते हैं

@daphtdazz इस बात पर बहुत अच्छी बात करता है कि यह सीधे 2 प्रिंट क्यों नहीं करता है

console.log तत्काल निष्पादन है। तो कल्पना कीजिए कि जिस व्यक्ति को आपने अभी-अभी लटकाया है, वह आपको तुरंत वापस बुलाने की कोशिश करता है। लेकिन आप अभी तक उत्तर नहीं देते हैं क्योंकि आपको बस इस अन्य कार्य को पूरा करने की आवश्यकता है। तब आप उत्तर दें।

1
Liam 27 मार्च 2018, 13:42

मोज़िला डेवलपर नेटवर्क डॉक्स के अनुसार:

[वादा] जावास्क्रिप्ट इवेंट लूप के वर्तमान रन के पूरा होने से पहले कॉलबैक कभी नहीं कहा जाएगा।

तो आपके .then() कॉलबैक को वर्तमान कोड समाप्त होने के बाद कॉल किया जाता है।

2
daphtdazz 27 मार्च 2018, 13:14