如何向async.waterfall的第一个异步函数传入变量
如何给async.waterfall的第一个函数传入外部变量?
嘿,我来帮你解决这个问题!你遇到的问题其实是对async.waterfall的任务函数参数规则理解错了——它的第一个任务函数只能接收callback作为参数,你自己额外加的myTestSubject参数不会被async库传递值,所以才会显示undefined。
下面给你几种可行的解决方法:
方法一:利用闭包直接访问变量(最常用)
因为你定义的任务函数是在myTestSubject的作用域内创建的,借助闭包特性,它可以直接访问这个外部变量,完全不需要额外传参:
var myTestSubject = "hello"; async.waterfall([ function(callback){ console.log(myTestSubject); // 这里会正常输出"hello" callback(null, 'one', 'two'); }, function(arg1, arg2, callback){ callback(null, 'three'); }, function(arg1, callback){ callback(null, 'done'); } ], function (err, result) { console.log(result); // 输出"done" });
方法二:使用bind绑定参数
如果你的任务函数是单独定义的,或者想更明确地传递参数,可以用Function.prototype.bind来预先绑定变量:
var myTestSubject = "hello"; // 单独定义第一个任务函数 function firstTask(myVar, callback) { console.log(myVar); // 输出"hello" callback(null, 'one', 'two'); } async.waterfall([ // 用bind把myTestSubject作为第一个参数传入,async会自动传入callback作为第二个参数 firstTask.bind(null, myTestSubject) ], function (err, result) { console.log(result); });
方法三:ES6箭头函数(简洁写法)
如果你用的是ES6及以上版本,箭头函数同样会捕获外部作用域的变量,写法更简洁:
const myTestSubject = "hello"; async.waterfall([ (callback) => { console.log(myTestSubject); // 输出"hello" callback(null, 'one', 'two'); }, (arg1, arg2, callback) => callback(null, 'three'), (arg1, callback) => callback(null, 'done') ], (err, result) => { console.log(result); });
简单总结一下:最推荐的是方法一,借助闭包直接使用变量,代码简洁且符合async库的使用习惯。
内容的提问来源于stack exchange,提问作者Think Tank
相关产品推荐
相关产品推荐

