वैकल्पिक
इसका एक विकल्प:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
स्पष्ट रूप से वादों का उपयोग करते हुए कुछ इस तरह होगा:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
या ऐसा कुछ, निरंतरता गुजर शैली का उपयोग करके:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
मूल उदाहरण
आपका मूल कोड क्या करता है, निष्पादन को निलंबित कर देता है और getQuote()
निपटान के लिए दिए गए वादे की प्रतीक्षा करता है । इसके बाद यह निष्पादन जारी रखता है और लौटाए गए मान को लिखता है var quote
और फिर उसे प्रिंट करता है यदि वादा हल किया गया था, या एक अपवाद फेंकता है और कैच ब्लॉक को चलाता है जो कि त्रुटि को अस्वीकार करता है यदि वादा अस्वीकार कर दिया गया था।
आप सीधे दूसरे उदाहरण की तरह प्रॉमिस एपीआई का उपयोग करके भी ऐसा कर सकते हैं।
प्रदर्शन
अब, प्रदर्शन के लिए। चलिए इसे टेस्ट करते हैं!
मैंने अभी यह कोड लिखा है - रिटर्न वैल्यू के रूप में f1()
देता है 1
, अपवाद के रूप में f2()
फेंकता 1
है:
function f1() {
return 1;
}
function f2() {
throw 1;
}
अब उसी कोड को मिलियन बार कॉल करते हैं, पहले f1()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
और फिर चलो में बदल f1()
जाते हैं f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
यह मेरे लिए मिला परिणाम है f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
यह मेरे लिए है f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
ऐसा लगता है कि आप कुछ कर सकते हैं जैसे कि एक एकल-थ्रेडेड प्रक्रिया में 2 मिलियन फेंकता है। यदि आप इससे अधिक कर रहे हैं तो आपको इसके बारे में चिंता करने की आवश्यकता हो सकती है।
सारांश
मैं इस तरह की चीजों के बारे में चिंता नहीं करूंगा। अगर इस तरह की चीजों का बहुत उपयोग हो जाता है, तो यह अंततः V8 या स्पाइडरमोंकी या चक्र टीमों द्वारा अनुकूलित हो जाएगी और हर कोई इसका पालन करेगा - ऐसा नहीं है कि यह एक सिद्धांत के रूप में अनुकूलित नहीं है, यह सिर्फ एक समस्या नहीं है।
यहां तक कि अगर यह अनुकूलित नहीं है, तो मैं अभी भी तर्क दूंगा कि यदि आप अपने सीपीयू को नोड में अधिकतम कर रहे हैं, तो आपको संभवतः अपना नंबर सी में क्रंचिंग लिखना चाहिए - यही है, जो अन्य चीजों के साथ देशी ऐडऑन हैं। या शायद नोड.जेक्टिव जैसी चीजें Node.js. की तुलना में नौकरी के लिए बेहतर अनुकूल होंगी
मैं सोच रहा हूं कि ऐसा क्या उपयोग होगा जो इतने सारे अपवादों को फेंकने की जरूरत है। आमतौर पर एक मूल्य को वापस करने के बजाय एक अपवाद फेंकना, ठीक है, एक अपवाद है।