Async: 在 async.auto 链中使用 async / await 会导致 TypeError: callback is not a function

创建于 2018-09-24  ·  5评论  ·  资料来源: caolan/async

您使用的是什么版本的异步?
2.6.1

问题发生在哪个环境(节点版本/浏览器版本)
8.11.3

你做了什么?
假设 fileObj 是从外部提供的:

async.auto({
  download: (downloadCB) => {
    if (fileObj) {
      fs.writeFile(__dirname + ‘fileNew.txt’, fileObj.content, 'base64', function (err) {
        if (err){
          return downloadCB(err);
        }
        return downloadCB(null , fileObj.generatedFileName); // works fine
      });
    } else {
      let err = new Error('File not found');
      return downloadCB(err);
    }
  },
  collectData: ['download', async (results, collectCB) => {
    console.log(typeof collectCB); // prints undefined
    console.log(typeof results); // prints correct object

    let res = await anHttpRequest();
    if (res.response && res.response.statusCode == 200) {
      return collectCB(null , 'fileCombined.txt'); // This is where the ISSUE happens
    }
    else if(res.response.statusCode >= 300) {
      return collectCB(new Error('Request failed inside async-auto'));
    }
  }],

  filterData: ['collectData', (results, filterCB) => {
    doFilter(results.collectData, filterCB);
  }],
})

你期望会发生什么?
collectData 执行完毕后,filterData 应该开始执行 collectCB 函数内部传递的参数

实际结果如何?
类型错误:collectCB 不是函数。

相同的代码在 2.0.1 版本中运行良好,但在升级到 2.6.1 后它停止工作,这对我们来说至关重要。 任何解决方法也将不胜感激。

docs question

最有用的评论

我们以不同的方式对待async函数——我们不向它们传递回调。 相反,只需return一个值(或throw一个错误)。

所有5条评论

我们以不同的方式对待async函数——我们不向它们传递回调。 相反,只需return一个值(或throw一个错误)。

是的,从 StackOverflow 学到了同样的东西,所以在这里发布一个对相同的引用,以防将来有人偶然发现: Using-async-await-inside-async-auto-chain

这也适用于 async.parallel 如果函数是异步的,您需要返回值而不是调用回调。 这应该添加到文档和示例中。

        async.parallel({
            // NOTE: for async functions just return value or throw error
            // don't use the callback
            dates: async function(callback) {
                var rr = await getDates(dbName, r.indi, idx);
                return rr;
             },
             sdates: async function(callback) {
                  var rr = await getDates(dbName, r.spouse, idx);
                  return rr;
             },
             cdates: async function(callback) {
                  var rr = await getDates(dbName, r.cindi, idx);
                  return rr;
             }
        },
        function(err, results) {
             console.log(results);
        });

我想重写文档中的很多示例以使用更多的 async/await,以突出您现在可以做的事情。

除了这个包中的功能,我们还需要文档。 将来能看到更多例子会很棒

此页面是否有帮助?
0 / 5 - 0 等级