您使用的是什么版本的异步?
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 后它停止工作,这对我们来说至关重要。 任何解决方法也将不胜感激。
我们以不同的方式对待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,以突出您现在可以做的事情。
除了这个包中的功能,我们还需要文档。 将来能看到更多例子会很棒
最有用的评论
我们以不同的方式对待
async
函数——我们不向它们传递回调。 相反,只需return
一个值(或throw
一个错误)。