Я никогда не использовал etl
раньше, но в их документации есть комментарий, который говорит
Переключение с цепочки на поток обещаний ...
А затем дает код .promise().then(...)
. Вы говорите, что пробовали Promise.all
, но не говорите как, поэтому я не знаю, пробовали ли вы это уже. Но это направление, в котором я мог бы подумать:
function unzipAndUploadToS3(fileInfo) {
return new Promise((resolve, reject) => {
fs.createReadStream(fileInfo.zip.path)
.pipe(unzipper.Parse())
.pipe(etl.map(entry => {
if (checkEntry(entry.path)) {
fileInfo.name = entry.path;
return entry.buffer() //<- return promise
.then(content => {
fileInfo.data = content;
return AWS.uploadToS3(fileInfo) //<- return promise
})
}
else
entry.autodrain();
}))
.promise().then(awsPromises => Promise.all(awsPromises)) //<- return promise
.then(x => resolve('x should be an array of s3 results'))
.catch(err => reject(err));
});
}
Чтобы это работало, хотя все обещания должны быть надлежащим образом связаны друг с другом для буферизации записи и затем загружены в s3. Я отметил важные результаты, чтобы сохранить связь с комментариями.
Еще кое-что, что выглядит немного странно для меня: я не могу поверить, что вы можете продолжать использовать один и тот же fileInfo
с несколькими такими файлами. Для меня это похоже на состояние гонки: закончится ли предыдущая загрузка до того, как следующий файл перезапишет fileInfo.data
и fileInfo.name
? Полагаю, вам лучше создать новый объект fileInfo внутри вашей карты, а не использовать один и тот же для всех файлов в zip-файле.