You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:37:02