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