如何在async.auto任务列表中传递预定义函数?
在async.auto中使用预定义函数的方法
嘿,我完全懂你的困惑!其实在async.auto里用预定义函数代替内联函数非常简单,关键是要保证你的预定义函数符合async任务的签名要求——也就是要能接收callback参数(如果任务依赖其他结果,还要先接收依赖的输出值)。下面给你一步步拆解:
1. 基础场景:无依赖的预定义函数
像你例子里的getAccessToken任务,本身不需要依赖其他任务的结果,那你可以直接把它抽成独立函数:
// 预定义你的任务函数 function getAccessToken(callback) { let x = { access_token: signToken({ userId: user._id }), client: req.user._id, user: user._id, scope: user.scopes, expires: new Date().setMinutes(new Date().getMinutes() + 15) // 小纠正:setDate是设置日期,这里应该用setMinutes }; callback(null, x); }
然后在async.auto里直接引用这个函数名就行,不用再写内联函数:
async.auto({ getAccessToken: getAccessToken // 直接传入预定义函数 }, (err, res) => { console.log(res); });
2. 进阶场景:带依赖的预定义函数
如果你的任务需要依赖其他任务的结果,预定义函数要把依赖的结果作为第一个参数,callback作为最后一个参数。比如你有个任务要用到getAccessToken的结果:
// 预定义依赖其他任务的函数 function useToken(accessToken, callback) { // accessToken就是getAccessToken任务返回的结果 const result = `成功使用Token:${accessToken.access_token}`; callback(null, result); }
然后在async.auto里指定依赖关系,把函数放在依赖数组的后面:
async.auto({ getAccessToken: getAccessToken, useToken: ['getAccessToken', useToken] // 先声明依赖,再传入预定义函数 }, (err, res) => { console.log(res.useToken); // 会输出上面的result内容 });
3. 注意作用域问题:访问外部变量
你的例子里用到了user和req这些外部变量,如果预定义函数不在这些变量的作用域内,会导致无法访问。这时候可以用闭包把变量封装进去:
// 用闭包函数封装外部依赖的变量 function createGetAccessToken(user, req) { return function(callback) { let x = { access_token: signToken({ userId: user._id }), client: req.user._id, user: user._id, scope: user.scopes, expires: new Date().setMinutes(new Date().getMinutes() + 15) }; callback(null, x); }; } // 创建绑定了user和req的任务函数 const getAccessToken = createGetAccessToken(user, req); // 正常在async.auto里使用 async.auto({ getAccessToken: getAccessToken }, (err, res) => { console.log(res); });
这样就能确保预定义函数能正确访问到外部的user和req啦!
内容的提问来源于stack exchange,提问作者Ahsan Aasim
相关产品推荐
相关产品推荐

