Alternatives
Une alternative à ceci:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
serait quelque chose comme ça, en utilisant explicitement les promesses:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
ou quelque chose comme ça, en utilisant le style de passage continu:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
Exemple original
Ce que fait votre code d'origine est de suspendre l'exécution et d'attendre que la promesse retournée soit getQuote()
réglée. Il continue ensuite l'exécution et écrit la valeur renvoyée dans var quote
, puis l'imprime si la promesse a été résolue, ou lève une exception et exécute le bloc catch qui imprime l'erreur si la promesse a été rejetée.
Vous pouvez faire la même chose en utilisant l'API Promise directement comme dans le deuxième exemple.
Performance
Maintenant, pour la performance. Testons-le!
Je viens d'écrire ce code - f1()
donne 1
comme valeur de retour, f2()
jette 1
comme exception:
function f1() {
return 1;
}
function f2() {
throw 1;
}
Appelons maintenant le même code des millions de fois, d'abord avec f1()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
Et puis passons f1()
à f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
Voici le résultat que j'ai obtenu pour f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
Voici ce que j'ai pour f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
Il semble que vous puissiez faire quelque chose comme 2 millions de lancers par seconde dans un processus à un seul thread. Si vous faites plus que cela, vous devrez peut-être vous en inquiéter.
Résumé
Je ne m'inquiéterais pas des choses comme ça dans Node. Si des choses comme ça sont beaucoup utilisées, elles seront finalement optimisées par les équipes V8 ou SpiderMonkey ou Chakra et tout le monde suivra - ce n'est pas comme si ce n'était pas optimisé en tant que principe, ce n'est tout simplement pas un problème.
Même s'il n'est pas optimisé, je dirais toujours que si vous maximisez votre processeur dans Node, vous devriez probablement écrire votre calcul numérique en C - c'est à cela que servent les addons natifs, entre autres choses. Ou peut-être que des choses comme node.native conviendraient mieux à ce travail que Node.js.
Je me demande quel serait un cas d'utilisation qui aurait besoin de tant d'exceptions. En général, lever une exception au lieu de renvoyer une valeur est, eh bien, une exception.