ทางเลือก
อีกทางเลือกหนึ่งสำหรับสิ่งนี้:
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
แล้วพิมพ์หากคำสัญญาได้รับการแก้ไขหรือโยนข้อยกเว้นและเรียกใช้บล็อก catch ที่พิมพ์ข้อผิดพลาดหากคำสัญญาถูกปฏิเสธ
คุณสามารถทำสิ่งเดียวกันโดยใช้ Promise API ได้โดยตรงเหมือนในตัวอย่างที่สอง
ประสิทธิภาพ
ตอนนี้สำหรับการแสดง มาทดสอบกัน!
ฉันเพิ่งเขียนรหัสนี้ - 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 หรือ SpiderMonkey หรือ Chakra และทุกคนจะปฏิบัติตาม - ไม่ใช่ว่ามันไม่ได้รับการปรับให้เหมาะสมตามหลักการมันก็ไม่ใช่ปัญหา
แม้ว่าจะไม่ได้รับการปรับให้เหมาะสมฉันก็ยังคงเถียงว่าหากคุณใช้ CPU สูงสุดใน Node คุณก็ควรเขียนจำนวนของคุณใน C - นั่นคือสิ่งที่ส่วนเสริมดั้งเดิมมีไว้สำหรับสิ่งอื่น ๆ หรือบางทีสิ่งต่างๆเช่นnode.nativeจะเหมาะกับงานมากกว่า Node.js
ฉันสงสัยว่าจะเป็นกรณีการใช้งานที่ต้องทิ้งข้อยกเว้นมากมาย โดยปกติแล้วการโยนข้อยกเว้นแทนที่จะส่งคืนค่าคือข้อยกเว้น