Alternativas
Uma alternativa para isso:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
seria algo assim, usando promessas explicitamente:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
ou algo assim, usando o estilo de passagem de continuação:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
Exemplo original
O que o seu código original faz é suspender a execução e esperar que a promessa retornada por getQuote()
se cumpra. Em seguida, ele continua a execução e grava o valor retornado emvar quote
e o imprime se a promessa foi resolvida, ou lança uma exceção e executa o bloco catch que imprime o erro se a promessa foi rejeitada.
Você pode fazer a mesma coisa usando a API Promise diretamente, como no segundo exemplo.
atuação
Agora, para a performance. Vamos testar!
Acabei de escrever este código - f1()
dá 1
como um valor de retorno, f2()
lança 1
como uma exceção:
function f1() {
return 1;
}
function f2() {
throw 1;
}
Agora vamos chamar o mesmo código milhões de vezes, primeiro com f1()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
E então vamos mudar f1()
para f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
Este é o resultado que obtive para f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
Isso é o que eu tenho para f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
Parece que você pode fazer algo como 2 milhões de jogadas por segundo em um processo de thread único. Se você estiver fazendo mais do que isso, talvez precise se preocupar com isso.
Resumo
Eu não me preocuparia com coisas assim em Node. Se coisas assim forem muito usadas, então serão otimizadas eventualmente pelas equipes V8 ou SpiderMonkey ou Chakra e todos irão seguir - não é como se não fosse otimizado como um princípio, simplesmente não é um problema.
Mesmo se não estiver otimizado, eu ainda diria que se você está maximizando sua CPU no Node, então você provavelmente deve escrever seu cálculo de número em C - é para isso que servem os addons nativos, entre outras coisas. Ou talvez coisas como node.native sejam mais adequadas para o trabalho do que Node.js.
Estou me perguntando qual seria um caso de uso que precisa lançar tantas exceções. Normalmente, lançar uma exceção em vez de retornar um valor é, bem, uma exceção.