使用async waterfall时为何报TypeError: callback不是函数错误
为什么会出现
TypeError: callback is not a function? 这个问题我之前也踩过坑,核心原因是async库对async函数的处理逻辑和普通函数完全不一样:当你把async函数作为async.waterfall的任务时,async库会自动检测到这个函数返回的是Promise(因为async函数默认返回Promise),这时它就不会再给这个函数传入callback参数了。所以你的第二个函数里的callback变量其实是undefined,当你调用callback(null, data)时,自然就会抛出“callback不是函数”的错误。
async函数在async.waterfall里是可行的,只是用法错了
async库完全支持Promise风格的任务,你只需要调整写法就行:
正确写法1:用async函数返回Promise(推荐)
直接去掉第二个函数里的callback参数,把要传递的结果return出去就行,async库会自动把Promise的解析值传给下一个任务:
var async = require('async'); async.waterfall([ (callback) => { callback(null, 'test'); }, async (value1) => { // 这里不再接收callback参数 const data = await send("http://google.com/search?q="+value1); return data; // 返回结果,自动传给后续任务 } ], (err, finalResult) => { // 这里可以拿到最终的结果 if (err) throw new Error(err); console.log(finalResult); });
正确写法2:保留callback,不用async函数
如果你一定要用callback的方式,就不要给任务函数加async关键字,改用Promise的.then()来处理异步操作:
var async = require('async'); async.waterfall([ (callback) => { callback(null, 'test'); }, (value1, callback) => { send("http://google.com/search?q="+value1) .then(data => callback(null, data)) .catch(err => callback(err)); } ], (err) => { if (err) throw new Error(err); });
总结一下
- async库会根据任务函数的类型自动调整参数:普通函数会传入
callback,返回Promise的函数(包括async函数)则不会。 - 在async.waterfall里用async函数是完全可行的,只要记得不要在async函数里接收callback参数,直接返回结果就好。
内容的提问来源于stack exchange,提问作者rsmnarts
相关产品推荐
相关产品推荐

