3

ファイルのセット、module1.js、module2.js、module3.js があり、これらのそれぞれには、実行されるプロパティ メソッドを持つ戻りオブジェクトが含まれています。オブジェクトが検査されてプロパティ名が動的に決定され、.toString()メソッドが決定されます。

内部メソッドには、ほぼ確実に次のような非同期呼び出しが含まれます。

function doSomething(vars){
  var that = this,
      red = 'blue',
      up = 'down',
      one = 2;

   makeAsync(that,red,up,one,function(err,res){
      return makeDeep(res);
   }
}

ファイル module1.js、module2.js、および module3.js への書き込み可能なアクセス権を積極的に持たずに、呼び出し元の親メソッドからこれらのメソッドをマーシャリングして、最終的に値を返すにはどうすればよいですか。それらは石で鋳造され、決して編集できないと仮定します。合理的な他のすべては公正なゲームです。ただ、「doSomething を書き直して CB を渡し、CBmakeDeepでラップできるようにしてください」とは言わないでください。私は自分のコードからこのモジュールを呼び出していることに注意してくださいmakeAsync。モジュールの作成者が呼び出したい非同期メソッドは何でもです。


重要な注意:私は書いているmakeDeep人であり、モジュールを含んでいるので、これら2つの場所のいずれかであなたが望むことは何でもできmakeDeep、モジュールに動的に注入されます(私はミックスインパターンを行っています)。 「親」呼び出しメソッドで動作するように変更するか、何かに依存してmakeDeepいます。これは100%合理的であり、私はそれについてすべてです。

この場合、returnキーワードを前に持つ「必要」はありませんmakeDeepが、構文でそれらの単語が使用されている場合はボーナス ポイントがあります (これは開発者に、それがコードの終了点であることを強く示していますか?)


module1.js が次のようになっているとします。

module.exports = function() {
    this.doSomething11 = function doSomething(vars){
      var that = this,
          red = 'blue',
          up = 'down',
          one = 2;

       makeAsync(that,red,up,one,function(err,res){
          return makeDeep(res);
       }
    }
}

module2.js

module.exports = function() {
    this.doSomething21 = function doSomething(vars){
      var that = this,
          red = 'blue',
          up = 'down',
          one = 2;

       makeAsync(that,red,up,one,function(err,res){
          return makeDeep(res);
       }
    };

    this.doSomething22 = function doSomething(vars){
      var that = this,
          red = 'blue',
          up = 'down',
          one = 2;

       makeAsync(that,red,up,one,function(err,res){
          return makeDeep(res);
       }
    };
}

module3.js

module.exports = function() {
    this.doSomething31 = function doSomething(vars){
      var that = this,
          red = 'blue',
          up = 'down',
          one = 2;

       makeAsync(that,red,up,one,function(err,res){
          return makeDeep(res);
       }
    };

    this.doSomething32 = function doSomething(vars){
      var that = this,
          red = 'blue',
          up = 'down',
          one = 2;

       makeAsync(that,red,up,one,function(err,res){
          return makeDeep(res);
       }
    };

    this.doSomething33 = function doSomething(vars){
      var that = this,
          red = 'blue',
          up = 'down',
          one = 2;

       makeAsync(that,red,up,one,function(err,res){
          return makeDeep(res);
       }
    }
}

はい、実際の詳細よりも概念に重点を置いているため、例は不自然です。それらは、3 重にネストされたコールバックである場合もあれば、ある種の内部コールバックを使用する場合もあります。ほとんどの場合、これを実現する方法があるかどうかを知りたいだけです。

そうでない場合、ユーザーに特定のライブラリを提供し、ライブラリに戻してもらう場合、どうすればユーザーのために機能させることができますか?

私の目標は、ASP.NET スタイルの ActionResult に似たものを複製することであり、Q、ファイバー、または約束を使用するという考えにはオープンですが、非同期コールバック時にそれを取得するための呼び出しの周りに何かが欠けています使用されている。

4

1 に答える 1

1

return that.makeDeep()の代わりに必要なモジュールを呼び出すだけでよいという問題に取り組みますreturn makeDeep()。呼び出されたコードを変更したくないことは知っていますが、いつでもブリトーを使用してそれらの行を動的に変更できます (書き込みアクセスは必要ありません)。

呼び出しコード

var Controller = require('./module1');
assert(typeof Controller == 'function');

httpServer.on('request', function(req, res) {
    // I assume this is something you would do
    var vars = processReqParameters(req);
    var action = vars.action;
    var controller = new Controller();

    if(typeof controller[action] === 'function') {
        // now I assume that makeDeep will at one point
        // call res.end();
        var makeDeep = createMakeDeep(req, res, vars) // or other parameters

        // this is how we inject makeDeep in the controller
        var controllerInstance = Object.create(controller, {makeDeep: makeDeep});
        return controllerInstance[action](vars);
    }
    else {
        res.writeHead(404, 'Controller Not Found');
        res.end('Too bad\n');
    }
})

コードと呼ばれる

module.exports = function() {
    this.myAction = function(vars)  {
        var that = this,
            red = 'blue',
            up = 'down',
            one = 2;

        makeAsync(that, red, up, one, function(err, res) {
            return that.makeDeep(res);
        })
    }
}
于 2013-02-11T09:24:01.650 に答える