alternative
Un'alternativa a questo:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
sarebbe qualcosa di simile, usando le promesse esplicitamente:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
o qualcosa del genere, usando lo stile di passaggio di continuazione:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
Esempio originale
Quello che fa il tuo codice originale è sospendere l'esecuzione e attendere che la promessa restituita da si getQuote()
concluda. Quindi continua l'esecuzione e scrive il valore restituito, var quote
quindi lo stampa se la promessa è stata risolta oppure genera un'eccezione ed esegue il blocco catch che stampa l'errore se la promessa è stata rifiutata.
Puoi fare la stessa cosa usando l'API Promise direttamente come nel secondo esempio.
Prestazione
Ora, per la performance. Proviamolo!
Ho appena scritto questo codice - f1()
dà 1
come valore di ritorno, f2()
genera 1
come eccezione:
function f1() {
return 1;
}
function f2() {
throw 1;
}
Ora chiamiamo lo stesso codice milioni di volte, prima con f1()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
E poi passiamo f1()
a f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
Questo è il risultato che ho ottenuto per f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
Questo è quello che ho ottenuto per f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
Sembra che tu possa fare qualcosa come 2 milioni di lanci al secondo in un processo a thread singolo. Se stai facendo di più, potresti doverti preoccupare.
Sommario
Non mi preoccuperei di cose del genere in Node. Se cose del genere vengono utilizzate molto, alla fine verranno ottimizzate dai team V8 o SpiderMonkey o Chakra e tutti seguiranno - non è che non sia ottimizzato come principio, semplicemente non è un problema.
Anche se non è ottimizzato, direi comunque che se stai massimizzando la tua CPU in Node, dovresti probabilmente scrivere il tuo numero scricchiolio in C - questo è ciò a cui servono gli addon nativi, tra le altre cose. O forse cose come node.native sarebbero più adatte per il lavoro di Node.js.
Mi chiedo quale sarebbe un caso d'uso che necessita di così tante eccezioni. Di solito lanciare un'eccezione invece di restituire un valore è, beh, un'eccezione.