我是 javascript 新手,所以这可能是一件微不足道的事情。我正在尝试根据 Node JS/Restify 异步模块的 waterfall 方法串联运行一组函数。此方法的主要优点是可以将当前回调的“结果”传递给下一个回调,依此类推,有可能打破“waterfall ”并运行下一个中间件。
如文档中所述,其参数是函数数组和最后一个中间件。
所以我根据下面的代码设置我的函数并调用
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)
)
我得到了预期的结果,并且 req 对象在函数 1 (fn1) 的范围内得到了很好的定义。
所以我认为我错过了一些非常基本的东西,但没有从哪里开始..
谢谢
最佳答案
闭包在创建函数的范围内工作,而不是在它们执行的范围内工作。例如,以下应该工作:
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();
});
});
关于javascript - async.waterfall 失去了范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27415400/