代替案
これの代替:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
明示的にpromiseを使用すると、次のようになります。
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
または、継続渡しスタイルを使用して次のようなもの:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
元の例
元のコードが実行するのは、実行を一時停止し、が返す約束getQuote()
が解決するのを待つことです。次に、実行を継続して戻り値を書き込み、var quote
promiseが解決された場合はそれを出力するか、例外をスローして、promiseが拒否された場合にエラーを出力するcatchブロックを実行します。
2番目の例のように、Promise APIを直接使用して同じことを行うことができます。
パフォーマンス
さて、パフォーマンスのために。テストしてみましょう!
私はこのコードを書いたところです- 戻り値としてf1()
与え、例外としてスローします:1
f2()
1
function f1() {
return 1;
}
function f2() {
throw 1;
}
今度は同じコードを100万回呼び出しましょうf1()
。
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
次に、次のように変更f1()
しf2()
ます。
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
これは私が得た結果ですf1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
これは私が得たものですf2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
1つのシングルスレッドプロセスで200万スローを1秒にスローするようなことができるようです。それ以上のことをしている場合は、心配する必要があるかもしれません。
概要
Nodeではそのようなことは心配しません。このようなものが頻繁に使用されると、V8、SpiderMonkey、またはChakraチームによって最終的に最適化され、誰もがフォローします。原則として最適化されていないようではなく、単に問題ではありません。
それが最適化されていない場合でも、NodeでCPUを最大限に活用している場合は、Cで数値を計算する必要があると私は主張します。これが、ネイティブアドオンの目的です。あるいは、node.nativeのようなものがNode.jsよりもジョブに適しているでしょう。
非常に多くの例外をスローする必要があるユースケースは何でしょうか。通常、値を返す代わりに例外をスローすることは、例外です。