私は Node.js でいくつかのモジュールを作成していますが、「Node.js でいつ return ステートメントを使用するかについての規則はありますか?」と疑問に思いました。
私が理解していることから、 return ステートメントはプロセスをブロック操作にするため避けるべきですが、いつ使用する必要があるか、いつコールバックに固執する必要があるかについてのガイドラインはありますか?
私は Node.js でいくつかのモジュールを作成していますが、「Node.js でいつ return ステートメントを使用するかについての規則はありますか?」と疑問に思いました。
私が理解していることから、 return ステートメントはプロセスをブロック操作にするため避けるべきですが、いつ使用する必要があるか、いつコールバックに固執する必要があるかについてのガイドラインはありますか?
何かが「ブロック」されているかどうかはあなた次第です。時間がかかりますか?
IO 操作は、スクリプトの外部にあるものに依存しているため (時間がかかる可能性があるため)、ブロックしていると見なす必要があります。
あなた自身のスクリプトが何かを数百回ループすると言った場合 (そして、これには数分の 1 秒以上かかることがわかっています)、それがブロックしていると考えるかもしれません。
関数はコールバックを受け入れるため、関数が非同期であることを知っているというだけの慣例であるべきです。
それが「安価な」操作であれば、それはまったく問題ありません。CPU を集中的に使用する操作を行っていない複数回実行される操作は、「通常の」機能にリファクタリングできます (多くの場合、リファクタリングする必要があります)。これで問題ありません:
function add(x, y) { return x + y; }
これではありません:
function fib(n) {
if (n <= 1) return 1;
// this may take a long time if n is large
return fib(n - 1) + fib (n - 2);
}
fib の可能な実装は、結果をパラメーターとして返す関数を取り、複数の呼び出しに計算を分散します。本「 Node Web Development 」からの以下のコードのようなもの:
function fib(n, done) {
if (n <= 1) {
done(1);
} else {
process.nextTick(function() {
fib(n - 1, function(val1) {
process.nextTick(function() {
fib(n - 2, function(val2) {
done(val1 + val2);
});
});
});
});
}
}
スレッドが長時間ブロックされない場所。
はい、より良い代替手段は、再帰的な方法ではなく、反復的な方法でフィボナッチを実装することです。ただし、これは、CPU を大量に使用する関数を「分割」する方法を示すためのものです。