5

メソッドを簡単にチェーンできるライブラリを探していますが、チェーン内で引数がさらに提供されるまで実行を延期します。

chain
    .scanDirectory  ( '/path/to/scan' )
        .recursively()
        .for        ( /\.js$/i        )
    .cache()
    .provideTo      ( '0.locals'      )
        .as         ( 'scripts'       )
    .defer();

重要なことは、関数の背後にあるコードは、再帰的でファイルscanDirectoryを探す必要があると定義されるまで、実際には呼び出されないということです。.js

次のようなことができるように、これを論理的に設定する方法がよくわかりません。

chain
    .scanDirectory( '/path/to/scan' )
    .scanDirectory( '/another/path' )
        .for      ( /\.js$/i        ) // provided to both paths above?
    .doSomethingElse()

これが、これを達成するためのより成熟したアイデアを持つ可能性のあるライブラリを探している理由です:)

4

5 に答える 5

0

そのようなメソッドを構築するためのライブラリがあるかどうかはわかりませんが、その機能は自分で簡単に構築できます。基本的に、セッターメソッドと1つのexecute関数(あなたの場合はdefer)を持つ設定オブジェクトになります。

function Scanner() {
    this.dirs = [];
    this.recurse = false;
    this.search = "";
    this.cache = false;
    this.to = "";
    this.name = "";
}
Scanner.prototype = {
    scanDirectory: function(dir) {
        this.dirs.push(dir);
        return this,
    },
    recursively: function() {
        this.recurse = true;
        return this;
    },
    for: function(name) {
        this.search = name;
        return thsi;
    },
    cache: function() {
        this.cache = true;
        return this;
    },
    provideTo: function(service) {
        this.to = service;
        return this;
    },
    as: function(name) {
        this.name = name;
        return this;
    },
    defer: function() {
        // now, do something with all the given settings here
    },
    doSomethingElse: function() {
        // now, do something else with all the given settings here
    }
};

これは流暢なインターフェイスを構築する標準的な方法です。もちろん、メソッド名から設定へのマップを渡すヘルパー関数を作成して、メソッドが長くなりすぎた場合にメソッドを書き込むこともできます:-)

于 2013-06-05T20:53:53.040 に答える
0

これに対する万能の解決策が見つかることに注意してください。

ライブラリに既に焼き付けられている必要があるものに対する一般的な解決策を探しているようです。つまり、この機能を備えたライブラリがあると確信していますが、他のライブラリに自動的にフックすることはありません (ターゲットにしたいライブラリの適切なバージョンのオーバーライドを具体的に実装している場合を期待してください)。

ただし、いくつかのシナリオでは、Stream.jsライブラリを参照することをお勧めします。このライブラリは、興味深いデータ関連のケースを十分にカバーしている可能性があります。

于 2013-06-05T20:28:59.177 に答える
-3

@Jordan Doyleがコメントで言ったように:

戻るだけthis

したがって、オブジェクトのすべてのメソッドは、return ステートメントでオブジェクトを返す必要があります。これにより、別のメソッドをチェーンできるようになります。

例えば:

var obj = new (function(){

   this.methOne = function(){
      //...
      return this;
   }

   this.methTwo = function(){
      //...
      return this;
   }

   this.methThree = function(){
      //...
      return this;
   }

})();

//So you can do:
obj.methOne().methTwo().methThree();
于 2013-06-05T20:29:56.927 に答える