0

ノード 0.8.8 を Express 3.0 と一緒に使用しています。

いくつかのメソッドを持つオブジェクトchecksと、メソッドで満たされるべき空のオブジェクトmiddlewareがあります。 の各メソッドに 1 つのメソッドがchecksあり、基本的にcheckいくつかの追加の引数を使用して同等の機能を実行します。

コードは次のようになります。

var checks = {

  baz: function(req, callback) {
    console.log('baz');
    callback(true);
  },

  foo: function(req, callback) {
    console.log('foo');
    callback(true);
  },

  bar: function(req, callback) {
    console.log('bar');
    callback(true);
  }

};

var middleware = {};

for (var check in checks) {

  middleware[check] = function(req, res, next) {
    checks[check](req, function(result) {
      // ...
    });
  };

}

ただし、どのメソッドmiddlewareを呼び出しても、最後のメソッドをラップするメソッドchecksが実行されます。つまりmiddleware、キーは正しいが、同じメソッドで満たされているか、すべてのメソッド呼び出しmiddlewareが最後のメソッドを実行するかのいずれかです。

middleware.baz({}, function(){}); // => 'bar'
middleware.foo({}, function(){}); // => 'bar'
middleware.bar({}, function(){}); // => 'bar'

に割り当てられている新しく作成された関数を実行するとmiddleware[check]、関数は正しく、期待どおりにラップされます。middleware[check]最後のループから割り当てられた関数を呼び出しても、結果は期待どおりです。

for (var check in checks) {
  // ...
  middleware[check]({}, function(){});
}

// => baz
// => foo
// => bar

私は何が欠けていますか?

4

1 に答える 1

3

問題は、forループが終了すると、 の値がcheckの最後のプロパティと同じになることchecksです。各反復での値をキャプチャする必要がありcheck、クロージャを使用してこれを行うことができます。

for (var check in checks) {
  (function (check) {
    middleware[check] = function(req, res, next) {
      checks[check](req, function(result) {
        // ...
      });
    };
  }(check));
}

hasOwnPropertyのプロトタイプに設定されている列挙可能なプロパティを現在列挙するため、おそらくそのループにチェックを追加する必要があることに注意してくださいchecks

簡単なデモとして、この fiddleを見てください。コンソールを確認し、無名関数式のコメントを外して、コードを再度実行してください。

于 2012-09-01T18:49:28.880 に答える