Javascript 在async.auto链中使用async/await会导致TypeError:回调不是函数

Javascript 在async.auto链中使用async/await会导致TypeError:回调不是函数,javascript,async-await,async.js,Javascript,Async Await,Async.js,您使用的是什么版本的async? 2.6.1 问题发生在哪个环境中(节点版本/浏览器版本) 8.11.3 你做了什么?请提供一个最小的可复制案例来说明问题。 假设fileObj由外部提供: async.auto({ download: (downloadCB) => { if (fileObj) { fs.writeFile(__dirname + ‘fileNew.txt’, fileObj.content, 'base64', function (err) {

您使用的是什么版本的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函数中传递的参数

实际结果是什么?

TypeError:collectCB不是函数


同样的代码在版本2.0.1中执行得很好,但升级到2.6.1后,它已经停止工作,这对我们来说至关重要。任何解决办法都将不胜感激。

只需一份来自官方的复制粘贴:

无论我们在哪里接受节点样式的异步函数,我们也直接 接受ES2017异步函数。在这种情况下,异步函数将 不会传递最后的回调参数,任何抛出的错误都将被忽略 用作隐式回调的err参数,并返回 值将用作结果值。(即被拒绝的 返回的承诺将成为err回调参数,并且 值成为结果。)


只需粘贴一份官方文件:

无论我们在哪里接受节点样式的异步函数,我们也直接 接受ES2017异步函数。在这种情况下,异步函数将 不会传递最后的回调参数,任何抛出的错误都将被忽略 用作隐式回调的err参数,并返回 值将用作结果值。(即被拒绝的 返回的承诺将成为err回调参数,并且 值成为结果。)

基于(已在另一个答案中引用,但此处再次引用)

无论我们在哪里接受节点样式的异步函数,我们也直接接受ES2017异步函数。在这种情况下,不会向异步函数传递最终回调参数,任何抛出的错误都将用作隐式回调的err参数,返回值将用作结果值。(即,拒绝返回的承诺将成为err callback参数,解析值将成为结果。)

你要做的是

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);
        }
    },
    //                                      Note, no callback as per documentation
    collectData: ['download', async (results) => {
        console.log(typeof results); // prints correct object

        let res = await anHttpRequest();

        if (res.response && res.response.statusCode == 200) {
            // this return is equivalent to callback(null, value);
            return 'fileCombined.txt';
        } else if (res.response.statusCode >= 300) {
            // this throw is equivalent to callback(err);
            throw new Error('Request failed inside async-auto');
        }
        // but surely something should be here!? for status code 201-209?
    }],

    filterData: ['collectData', (results, filterCB) => {
        doFilter(results.collectData, filterCB);
    }],
})
基于(已在另一个答案中引用,但此处再次引用)

无论我们在哪里接受节点样式的异步函数,我们也直接接受ES2017异步函数。在这种情况下,不会向异步函数传递最终回调参数,任何抛出的错误都将用作隐式回调的err参数,返回值将用作结果值。(即,拒绝返回的承诺将成为err callback参数,解析值将成为结果。)

你要做的是

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);
        }
    },
    //                                      Note, no callback as per documentation
    collectData: ['download', async (results) => {
        console.log(typeof results); // prints correct object

        let res = await anHttpRequest();

        if (res.response && res.response.statusCode == 200) {
            // this return is equivalent to callback(null, value);
            return 'fileCombined.txt';
        } else if (res.response.statusCode >= 300) {
            // this throw is equivalent to callback(err);
            throw new Error('Request failed inside async-auto');
        }
        // but surely something should be here!? for status code 201-209?
    }],

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

嘿@JaromandaX,我在他们的GitHub页面上发布了相同的问题,但到目前为止没有得到任何回应,所以在这里交叉发布,向更多的读者开放,希望任何人都能提供帮助。现在有点关键。嘿@JaromandaX,我在他们的GitHub页面上发布了相同的问题,但到目前为止没有得到任何回应,所以交叉发布在这里,向更多的读者开放,希望任何人都能提供帮助。现在有点关键。谢谢!添加的代码有助于理解文档。哪一个是最后的回调@n.bharath-您是否阅读了引用的文档?在这种情况下,将不会向异步函数传递最终回调。谢谢!添加的代码有助于理解文档。哪一个是最后的回调@n.bharath-您是否阅读了引用的文档?在这种情况下,将不会向异步函数传递最终回调参数