Альтернативи
Альтернатива цьому:
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
а потім роздруковує його, якщо обіцянка була вирішена, або викидає виняток і запускає блок лову, який друкує помилку, якщо обіцянку було відхилено.
Можна зробити те ж саме, використовуючи 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 мільйонів кидків секунди за один однонитковий процес. Якщо ви робите більше цього, то, можливо, вам доведеться турбуватися про це.
Підсумок
Я б не турбувався про подібні речі в Node. Якщо подібні речі звикають багато, то з часом V8 або SpiderMonkey або Chakra будуть оптимізовані, і всі будуть слідувати - це не так, як це не оптимізовано як принцип, це просто не проблема.
Навіть якщо це не оптимізовано, я все-таки стверджую, що якщо ви максимізуєте свій процесор у Node, то, ймовірно, ви повинні записати свій номер, який розсипається в C - ось для чого, серед іншого, і є рідні аддони. А може, такі речі, як node.native , краще підійдуть для роботи, ніж Node.js.
Мені цікаво, який би був корисний випадок, коли потрібно кинути стільки винятків. Зазвичай викидання виключення замість повернення значення - це, ну, виняток.