Lựa chọn thay thế
Một thay thế cho điều này:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
sẽ là một cái gì đó như thế này, sử dụng lời hứa rõ ràng:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
hoặc một cái gì đó như thế này, sử dụng phong cách tiếp tục đi qua:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
Ví dụ ban đầu
Những gì mã ban đầu của bạn làm là tạm dừng việc thực thi và chờ đợi lời hứa được trả về getQuote()
. Sau đó, nó tiếp tục thực hiện và ghi giá trị được trả về var quote
và sau đó in nó nếu lời hứa đã được giải quyết hoặc ném một ngoại lệ và chạy khối lệnh bắt lỗi in nếu lời hứa bị từ chối.
Bạn có thể làm điều tương tự bằng cách sử dụng API Promise trực tiếp như trong ví dụ thứ hai.
Hiệu suất
Bây giờ, cho hiệu suất. Hãy thử nghiệm nó!
Tôi vừa viết mã này - f1()
đưa ra 1
như một giá trị trả về, f2()
ném 1
như một ngoại lệ:
function f1() {
return 1;
}
function f2() {
throw 1;
}
Bây giờ, hãy gọi cùng một mã triệu lần, trước tiên bằng f1()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
Và sau đó hãy thay đổi f1()
thành f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
Đây là kết quả tôi nhận được f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
Đây là những gì tôi nhận được f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
Có vẻ như bạn có thể làm một cái gì đó như 2 triệu ném một giây trong một quy trình đơn luồng. Nếu bạn đang làm nhiều hơn thế thì bạn có thể cần phải lo lắng về nó.
Tóm lược
Tôi sẽ không lo lắng về những điều như thế trong Node. Nếu những thứ như thế được sử dụng nhiều thì cuối cùng nó sẽ được tối ưu hóa bởi các đội V8 hoặc SpiderMonkey hoặc Chakra và mọi người sẽ tuân theo - không giống như nó không được tối ưu hóa theo nguyên tắc, đó không phải là vấn đề.
Ngay cả khi nó không được tối ưu hóa thì tôi vẫn lập luận rằng nếu bạn tối đa hóa CPU của mình trong Node thì có lẽ bạn nên viết số của bạn đang giòn trong C - đó là những gì các addon gốc dành cho, trong số những thứ khác. Hoặc có thể những thứ như node.native sẽ phù hợp với công việc hơn Node.js.
Tôi đang tự hỏi điều gì sẽ là một trường hợp sử dụng cần ném quá nhiều ngoại lệ. Thông thường, ném một ngoại lệ thay vì trả về một giá trị là một ngoại lệ.