Javascript 在async.auto链中使用async/await会导致TypeError:回调不是函数
您使用的是什么版本的async? 2.6.1 问题发生在哪个环境中(节点版本/浏览器版本) 8.11.3 你做了什么?请提供一个最小的可复制案例来说明问题。 假设fileObj由外部提供: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.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-您是否阅读了引用的文档?在这种情况下,将不会向异步函数传递最终回调参数