14

私たちは、主に内部プロジェクトのためにノードと協力し、テクノロジーを使用するための最良の方法を理解しています。

特定の非同期のバックグラウンドから来ていない場合、学習曲線は難しい場合がありますが、フレームワークに慣れ、プロセスを学習しています。

私たちを二極化させたのは、同期コードと非同期コードを使用するのに最適な時期はいつかということです。現在、IOと相互作用するものがある場合は、コールバックまたはイベントエミッター(指定されたもの)を介して非同期にする必要があるというルールを使用していますが、IOを使用していない他のアイテムは同期関数として構築できます(これは関数自体の重さや実際のブロックの程度にも依存しますが、Node.jsを使用する場合はこれが最善のアプローチですか?

たとえば、現在コードベース内に存在するHal+JSONビルダーを作成しています。同期しているのは、それが実行しているのは、かなり小さいオブジェクトリテラルを作成することだけであり、それ以上のものはないからです。外部の依存関係はなく、IOの相互作用もありません。

私たちのアプローチは取るのに良いアプローチですか?

4

3 に答える 3

18

同期的に実行されている2つの関数とfooが存在するとします。bar

function foo() {
    var returnValue = bar();
    console.log(returnValue);
}

function bar() {
    return "bar";
}

APIを「非同期」にするためには、コールバックを使用するようにAPIを変更します。

function foo() {
    bar(function(returnValue) {
        console.log(returnValue);
    });
}

function bar(callback) {
    callback("bar");
}

しかし、実際のところ、このコードはまだ完全に同期しています。コールバックは同じコールスタックで実行されており、スレッドの最適化は行われていません。スケーラビリティのメリットはありません。

次に、コードの可読性とコーディングスタイルの問題になります。私は個人的に、典型的なvar val = func();タイプコードがより読みやすく、容易に理解できると感じています。唯一の欠点は、ある日その機能を変更する必要がbarあり、I / Oアクティビティを実行したり、非同期の他の関数を呼び出したりする必要がある場合は、のAPIも変更する必要があることですbar

私の個人的な好み:該当する場合は、従来の同期パターンを使用してください。I / Oが関係している場合、または疑わしい場合は、常に非同期スタイルを使用してください。

于 2012-12-13T11:51:47.657 に答える
3

process.nextTick()を使用して同期関数を非同期関数に変換することはオプションですが、ソフトウェアが長時間ブロックしている場合にのみ使用する必要があります。同期関数が実行されているたびに、ノードはシングルスレッドであるため、他に何もできません。これは、アプリケーションがサーバーの場合、応答しなくなることを意味します。

同期機能を分割する前に、十分な情報に基づいて決定できるように、まずベンチマークとプロファイリングを行うことをお勧めします。そうしないと、最適化が時期尚早になるリスクがあります。

良い議論についてはここを参照してくださいhttps://softwareengineering.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil

ノードが他のことを実行できるようにするという意味で、関数を非同期にする方法は次のとおりですhttp://howtonode.org/understanding-process-next-tick

于 2012-12-13T12:00:26.880 に答える
1

「Hal+Jsonビルダー」とはわかりませんが、NodeJSについては次のように考えています。コードを可能な限り非同期で記述し、限界まで押し上げる必要があります。単純な理由は、非同期コードがパフォーマンスと応答性を交換することです。これはほとんどの場合、より重要です。

もちろん、特定の操作が本当に速い場合は、非同期コードは必要ありません。たとえば、次のコードについて考えてみます。

var arr = []; // assume array is nonempty
for (var i = 0, l = arr.length; i < l; i++) {
    arr[ i ].doStuff( );
}

arrが小さくて迅速な操作である場合はdoStuff、このコードを非同期で作成する必要はありません。ただし、時間がかかる場合は、次のように記述することを検討してください。

var arr = []; // assume array is nonempty
var process_array_element = function( ) {
    if (arr.length) {
        arr.pop().doStuff( );
        process.nextTick( process_array_element );
    }
};
process_array_element( );

現在、このコードは本当に非同期です。ジョブが完了するまでにはさらに時間がかかりますが、その間、サーバー全体がブロックされることはありません。パフォーマンスと応答性を交換しました。

結論:それはあなたの状況に依存します!:)

于 2012-12-13T11:54:57.207 に答える