0

我正在使用节点 0.8.8 和 express 3.0。

有一个checks带有几个方法的对象和一个middleware现在应该用方法填充的空对象,其中每个方法一个方法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.

As a simple demonstration, have a look at this fiddle. Check the console, then uncomment the anonymous function expression and run the code again.

于 2012-09-01T18:49:28.880 回答