Node.js中async.parallel可搭配await吗?为何async任务报callback类型错误?
报错根因
触发TypeError: callback is not a function的核心原因是,你用的async.parallel所在的async库,从3.0版本开始会自动识别任务函数的类型,按不同规则传参:
- 对普通结构的函数,它会按照传统回调模式,把
(err, result)签名的回调作为第一个参数传给任务,等任务手动调用这个callback返回执行结果 - 对
async关键字标记的原生异步函数(这类函数默认返回Promise),它会自动切换为Promise适配模式:完全不会给任务内部传入callback参数,只会等待函数内部的return值作为任务结果,捕获函数抛出的异常作为任务错误
你给task_1加上async关键字后,async库自动判定它是原生异步函数,根本没有传callback进函数作用域,你代码里写的callback(null, res_1)自然会触发报错。这也解释了你看到的现象:数据库查询的res_1已经打印出来了,但最终结果里task_1是undefined——因为报错发生在调用callback的环节,查询到的结果根本没有成功回传给async.parallel。
可直接运行的两种修正写法
写法1:适配async库的Promise模式(代码最简)
删掉async函数里对callback的依赖,直接把查询结果return出去,库会自动识别返回值:
var data = {}; data.task_1 = async function() { var res_1 = await getData("xyz"); console.log(res_1); // 直接return结果,不需要手动调用callback return res_1; } data.task_2 = function(callback) { var res_2 = "hello 2"; callback(null, res_2); } async.parallel(data, function(err, results) { if (err){ console.log(err); } console.log(results); });
写法2:保持原有回调逻辑(不依赖Promise适配)
不给任务加async关键字,用Promise的.then()衔接原有的callback调用逻辑,和你最开始能正常运行的普通函数逻辑完全一致:
var data = {}; data.task_1 = function(callback) { // 普通函数,正常接收async.parallel传入的callback getData("xyz") .then(res_1 => { console.log(res_1); callback(null, res_1); }) // 捕获数据库查询异常,回传给async.parallel .catch(err => callback(err)); } data.task_2 = function(callback) { var res_2 = "hello 2"; callback(null, res_2); } async.parallel(data, function(err, results) { if (err){ console.log(err); } console.log(results); });
内容的提问来源于stack exchange,提问作者Harald
相关产品推荐
相关产品推荐

