I have some operations on files that looks like this:
- Download zip file from remote server (it contains .csv file)
- Unzip it
- Parse csv
- Change it to object with some structure
- Put object into DB.
I want to use streams for parsing CSV and putting rows from it to DB one by one. Problem is I don't know how to combine streams with promises. Sample of my code
function processFile(filename) {
return fileManager.downloadFile(filename)
.then(filename => {
console.log('file downloaded');
return fileManager.extractZip(path.join(process.cwd(), 'tmp', `${filename}.zip`));
})
.then(filename => {
fs.createReadStream(path.join(process.cwd(), 'tmp', `${filename}.csv`))
.pipe(csvParser)
.on('data', data => {
//saveSingleItem returns Promise
saveSingleItem(prepareItem(data));
})
.on('error', err => console.log(err))
.on('end', () => console.log('end'));
})
.catch(err => console.log(err));
}
I want to know when this seqence ends. Promise.all could help somehow but I don't know how I can detect when both promises from saveSingleItem method and stream with rows from .csv file resolves/ends.