使用async.waterfall失去了范围

时间:2014-12-11 04:30:55

标签: javascript jquery node.js asynchronous express

我是javascript的新手,所以这可能是微不足道的。我试图根据Node JS / Restify的async模块的瀑布方法运行一系列函数。这种方法的主要优点是可以将当前回调的“结果”传递给下一个等等,有可能打破“瀑布”并运行下一个中间件。

如文档中所述,其参​​数是一系列函数和最后一个中间件。

所以我根据下面的代码设置我的功能并调用

var fn1 = function(callback){
    console.log(req.params.user_id);
    callback(null, req.params.user_id);
};

var fn2 = function(user_id, callback){
    console.log(user_id);
    callback();
}

server.get('/:user_id',
    function(req, res, next){
        async.waterfall([fn1, fn2],
        function(err, result){
            next();
        })
    },
    ...(next middleware)
)

我没有得到预期的结果,因为没有定义req对象。但是这样做:

 server.get('/:user_id',
      function(req, res, next){
          async.waterfall([
              function(callback){
                   console.log(req.params.user_id);
                   callback(null, req.params.user_id);
              },
              function(user_id, callback){
                   console.log(user_id);
                   callback();
              }
          ],
          function(err, result){next()});
      },
      ...(next middleware)
  )

我得到了预期的结果,并且在函数1(fn1)的范围内定义了req对象。

所以我认为我遗漏了一些非常基本的东西,但不知道从哪里开始......

由于

1 个答案:

答案 0 :(得分:1)

闭包在创建函数的范围内工作。不是它们执行的范围。例如,以下内容应该有效:

server.get('/:user_id', function(req, res, next) {
  var fn1 = function(callback){
      console.log(req.params.user_id);
      callback(null, req.params.user_id);
  };

  var fn2 = function(user_id, callback){
      console.log(user_id);
      callback();
  }

  async.waterfall([fn1, fn2],
    function(err, result){
      next();
    });
});