3

編集

すべての答えに感謝し、最終的にStep
ようなツールを使用することにしました。

私が必要とするのは「フロー制御」だけであり、パフォーマンスを低下させる可能性のあるものは他に必要ありません(正確にどれだけ影響するか、または影響を無視できるかはわかりません)。

そこで、フロー制御用の小さなツールを作成します。

line.js

/**
 * Create the "next" function
 * 
 * @param {Array} tasks 
 * @param {Number} index
 * @param {Number} last
 */
var next = function(tasks, index, last) {

    if (index == last) {

        return tasks[index + 1];
    }
    else {

        return function(data) {

            var nextIndex = index + 1;
            tasks[nextIndex](next(tasks, nextIndex, last), data);
        };
    }
};

/**
 * Invoke functions in line.
 */
module.exports = function() {

    var tasks = arguments,
        last = tasks.length - 2;

    tasks[0](next(tasks, 0, last));
};

利用方法:

var line = require("line.js");
line(function(next) {

    someObj.find(function(err, docs) {

        // codes
        next(docs);
    });
}, function(next, docs) {

    // codes
});

お役に立てれば。

編集終了


よく知られているように、
Node の組み込みモジュールまたはサードパーティ モジュールは、多くの場合、非同期 API を提供し
、結果を処理するために「コールバック」関数を使用します。

クールですが、次のようにコーディングすることがあります。

                   //some codes
              }
         }
    }
}

このようなコードは読みにくいです。

「遅延」ライブラリがそのような問題を解決できることは知ってい
ますが、Node.js 用の適切な「遅延」モジュールはありますか?
また、「deferred」で Node をコーディングした場合のパフォーマンスはどうですか?

4

5 に答える 5

4

Node ベースのコードでは大きな問題です頻繁に「コールバック ピラミッド」を成長させます。この問題に対処するには、いくつかの方法があります。

コード スタイル:

この煩わしさを、コードを一口サイズのチャンクに分割する機会として利用してください。これは、名前付きの小さな関数が急増する可能性が高いことを意味しますが、それはおそらく問題ありません! また、再利用の機会が増えるかもしれません。

フロー制御ライブラリ

正確に 5,937 億 2000 万のフロー制御ライブラリが存在します。より人気のあるもののいくつかを次に示します。

  • ステップの超基本的なシリアル & パラレル フロー管理。
  • seqは、より重いですが、より多くの機能を備えたフロー制御ライブラリです。
  • 他にもたくさんあります。npm レジストリで「フロー」と「フロー制御」を検索します(申し訳ありませんが、リンク可能ではないようです)。

言語拡張

JavaScript (または CoffeeScript) の上に、より同期感のある構文を提供するいくつかの試みがあり、多くの場合、飼いならされた論文の背後にある概念に基づいています。

  • TameJSは、これに対する OkCupid チームの答えです。
  • IcedCoffeeScript彼らは、CoffeeScript を介して TameJS をフォークとして移植しました。
  • streamline.jsは TameJS に非常に似ています。
  • StratifiedJSは、この問題に対するより重いアプローチです。

このルートは、一部の人にとっては契約を破るものです。

  • これは標準の JavaScript ではありません。ライブラリ/フレームワーク/などを構築している場合、ヘルプを見つけるのはより困難になります。
  • ライブラリによっては、変数のスコープが予期しない動作をすることがあります。
  • 生成されたコードは、デバッグや元のソースとの照合が難しい場合があります。

未来:

ノード コア チームはこの問題を十分に認識しており、問題を軽減するために下位レベルのコンポーネントにも取り組んでいます。v0.8でドメインの基本バージョンを導入する予定のようです。これにより、エラー処理をロールアップする方法が提供されます (return err if err主に一般的なパターンを回避します)。

これにより、よりクリーンなフロー制御ライブラリの優れた基盤が築かれ始め、コールバック ピラミッドを処理するより一貫した方法への道が開かれるはずです。現在、あまりにも多くの選択肢があり、コミュニティはまだほんの一握りの基準でさえ合意に近づいていません.

参考文献:

于 2012-04-24T01:20:00.893 に答える
1

たくさんの「遅延ライブラリ」があります。http://eirikb.github.com/nipster/#promisehttp://eirikb.github.com/nipster/#deferredをご覧ください。1つを選ぶには、スタイルとシンプルさだけの問題です:)

于 2012-04-23T10:43:54.523 に答える
1

それが本当に気に入らない場合は、名前付き関数を使用する代替手段が常にあります。これにより、インデントが削減されます。

それ以外の

setTimeout(function() {
  fs.readFile('file', function (err, data) {
    if (err) throw err;
    console.log(data);
  })
}, 200);

あなたはこれを行うことができます:

function dataHandler(err, data)
{
  if (err) throw err;
  console.log(data);
}

function getFile()
{
  fs.readFile('file', dataHandler);
}

setTimeout(getFile, 200);

同じこと、ネストなし。

于 2012-04-23T11:15:41.267 に答える
0

一部のシナリオで役立つ可能性のあるライブラリがいくつかありますが、全体として、それらをすべてに使用した後は興奮することはありません。

遅さの問題によると。node.js は非同期であるため、ラップされた関数はそれほどパフォーマンスを消費しません。

ここで遅延のようなライブラリを探すことができます

https://github.com/kriszyp/node-promise

また、この質問は非常に似ています

jQueryのdeferredに最も似ているnodejsライブラリは?

最後に、 CoffeeScriptをご覧になることをお勧めします。関数中かっこが削除されているため、javascriptにコンパイルされ、より美しい構文を持つ言語です。

于 2012-04-23T10:37:44.037 に答える
0

コードを実行する方法についていくつかの異なるオプションを提供するため、通常は async.js ライブラリを使用するのが好きです

于 2012-04-24T00:42:19.413 に答える