Alternativen
Eine Alternative dazu:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
wäre so etwas, wenn man Versprechen explizit verwendet:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
oder so ähnlich, unter Verwendung des Continuation-Passing-Stils:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
Originalbeispiel
Ihr ursprünglicher Code setzt die Ausführung aus und wartet, bis das zurückgegebene Versprechen erfüllt ist getQuote()
. Anschließend wird die Ausführung fortgesetzt und der zurückgegebene Wert in geschrieben var quote
und dann gedruckt, wenn das Versprechen aufgelöst wurde, oder es wird eine Ausnahme ausgelöst und der catch-Block ausgeführt, der den Fehler druckt, wenn das Versprechen abgelehnt wurde.
Mit der Promise-API können Sie dasselbe direkt wie im zweiten Beispiel tun.
Performance
Nun zur Aufführung. Lass es uns testen!
Ich habe gerade diesen Code geschrieben - f1()
gibt 1
als Rückgabewert, f2()
wirft 1
als Ausnahme:
function f1() {
return 1;
}
function f2() {
throw 1;
}
Rufen wir jetzt den gleichen Code millionenfach auf, zuerst mit f1()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
Und dann wechseln wir f1()
zu f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
Dies ist das Ergebnis, für das ich bekommen habe f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
Dafür habe ich f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
Es scheint, dass Sie in einem Single-Thread-Prozess etwa 2 Millionen Würfe pro Sekunde ausführen können. Wenn Sie mehr als das tun, müssen Sie sich möglicherweise darum kümmern.
Zusammenfassung
Ich würde mir über solche Dinge in Node keine Sorgen machen. Wenn solche Dinge häufig verwendet werden, werden sie irgendwann von den V8-, SpiderMonkey- oder Chakra-Teams optimiert und jeder wird folgen - es ist nicht so, als wäre es nicht als Prinzip optimiert, es ist einfach kein Problem.
Selbst wenn es nicht optimiert ist, würde ich dennoch argumentieren, dass Sie, wenn Sie Ihre CPU in Node maximal nutzen, Ihre Zahl wahrscheinlich in C schreiben sollten - dafür sind unter anderem die nativen Addons gedacht. Oder vielleicht wären Dinge wie node.native besser für den Job geeignet als Node.js.
Ich frage mich, was ein Anwendungsfall wäre, der so viele Ausnahmen auslösen muss. Normalerweise ist das Auslösen einer Ausnahme anstelle der Rückgabe eines Werts eine Ausnahme.