1

nodejsには、次のような高価な関数があります。

function expensiveCode(){
  a.doExensiveOperation(1);
  b.doAnotherExensiveOperation(2);
  c.doADiffererentExensiveOperation(3);
  d.doExensiveOperation(4);
}

各サブ関数呼び出しには異なるパラメーターがあるため、ループで実行することはできません。この高価な関数呼び出しを抑制して、次のようなnextTickで各サブ呼び出しが実行されるようにします。

function expensiveCode(){
    process.nextTick(function(){
        a.doExensiveOperation(1);
        process.nextTick(function(){
            b.doAnotherExensiveOperation(2);
            process.nextTick(function(){
                c.doADiffererentExensiveOperation(3);
                process.nextTick(function(){
                  d.doExensiveOperation(4);                 
                });
            });
        });
    });
}

それは明らかに醜いです、そして、20行の異なる操作があるならば、考えることさえできないほど恐ろしいでしょう。

「async.js」のような多くのライブラリを確認しましたが、それらはすべて、呼び出された関数が非同期であること、つまり完了時にコールバック関数を持つことを期待しているようです。すべてのコードを「完了時のコールバック」メソッドに変換せずにそれを行う簡単な方法が必要です。これはやり過ぎのようです。

4

1 に答える 1

2

バブルを破裂させて申し訳ありませんがasync.waterfall、おそらくあなたが望むものasync.seriesと組み合わせるasync.applyことができます。はい、これらの操作を非同期にする必要があります。あなたが 20 種類の計算負荷の高い操作を発見したとは信じがたいですが、どれも IO をまったく実行しません。bcryptCPU を集中的に使用する呼び出しの同期バージョンと非同期バージョンの両方を提供する方法の例については、ライブラリを確認してください。完了時にコードをコールバックに変換するのはやり過ぎではなく、ノードです。それがノードのルールです。関数が IO を実行せずにすぐに完了するか、コールバックで非同期にします。オプションの終わり。

于 2012-12-20T22:07:20.150 に答える