Альтернативы
Альтернатива этому:
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.
Мне интересно, какой вариант использования требует создания такого количества исключений. Обычно выдача исключения вместо возврата значения является исключением.
person
rsp
schedule
30.11.2016