2

私は Node.js でいくつかのモジュールを作成していますが、「Node.js でいつ return ステートメントを使用するかについての規則はありますか?」と疑問に思いました。

私が理解していることから、 return ステートメントはプロセスをブロック操作にするため避けるべきですが、いつ使用する必要があるか、いつコールバックに固執する必要があるかについてのガイドラインはありますか?

4

2 に答える 2

2

何かが「ブロック」されているかどうかはあなた次第です。時間がかかりますか?

IO 操作は、スクリプトの外部にあるものに依存しているため (時間がかかる可能性があるため)、ブロックしていると見なす必要があります。

あなた自身のスクリプトが何かを数百回ループすると言った場合 (そして、これには数分の 1 秒以上かかることがわかっています)、それがブロックしていると考えるかもしれません。

  • メソッドがブロックしている場合は、'callback' パラメーターを受け取り、それを非同期で呼び出す必要があります。
  • メソッドが非ブロッキングの場合、'callback' パラメーターを受け入れてはならず、少なくとも 1 つの 'return' ステートメントが必要です。

関数はコールバックを受け入れるため、関数が非同期であることを知っているというだけの慣例であるべきです。

于 2012-06-25T07:09:23.677 に答える
0

それが「安価な」操作であれば、それはまったく問題ありません。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 を大量に使用する関数を「分割」する方法を示すためのものです。

于 2012-06-24T19:30:40.767 に答える