Какую версию 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 он перестал работать и это критично для нас. Любые обходные пути также будут оценены.
Мы относимся к функциям async
другому - мы не передаем им обратный вызов. Вместо этого просто return
значение (или throw
- ошибка).
Да, узнал о том же из StackOverflow и поэтому разместил ссылку на то же самое здесь, на случай, если кто-то наткнется на это в будущем: Использование-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
- ошибка).