Alternatives
Une alternative à cela:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
serait quelque chose comme cela, à l'aide de promesses explicitement:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
ou quelque chose comme cela, à l'aide de continuation passing style:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
Exemple d'origine
Ce que votre code d'origine n'est la suspension de l'exécution et d'attendre la promesse du retournés par getQuote()
pour s'établir. Ensuite, il continue l'exécution et écrit la valeur retournée var quote
, puis l'imprime si la promesse a été résolu, ou lève une exception et exécute le bloc catch qui imprime le message d'erreur si la promesse a été rejetée.
Vous pouvez faire la même chose à l'aide de la Promesse de l'API directement comme dans le deuxième exemple.
Performance
Maintenant, pour la performance. Nous allons tester!
J'ai juste écrit ce code - f1()
donne 1
comme valeur de retour, f2()
jette 1
comme une exception:
function f1() {
return 1;
}
function f2() {
throw 1;
}
Maintenant, nous allons appeler le même code de 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 changeons f1()
de f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
C'est le résultat que j'ai pour l' f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
C'est ce que j'ai pour l' f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
Il semble que vous pouvez faire quelque chose comme 2 millions jette une deuxième dans un processus monothread. Si vous faites plus que cela, alors vous pouvez avoir besoin de s'inquiéter à ce sujet.
Résumé
Je ne voudrais pas vous soucier de choses comme ça dans le Nœud. Si des choses comme qui beaucoup elle sera optimisée par la suite par le V8 ou SpiderMonkey ou Chakra équipes et tout le monde va suivre - c'est pas comme si il n'est pas optimisé comme un principe, c'est tout simplement pas un problème.
Même si il n'est pas optimisé alors que j'avais encore affirmer que si vous êtes dépasser le maximum de votre CPU dans le Nœud, alors vous devriez probablement écrire votre numéro de croquant dans C - qu'est ce que le natif addons sont pour, entre autres choses. Ou peut-être des choses comme nœud.natif serait mieux adapté pour le travail qu'Node.js.
Je me demandais ce qui serait un cas d'utilisation qui doit balancer de nombreuses exceptions. Habituellement, la levée d'une exception au lieu de retourner une valeur est, ainsi, une exception.