1

I have some operations on files that looks like this:

  1. Download zip file from remote server (it contains .csv file)
  2. Unzip it
  3. Parse csv
  4. Change it to object with some structure
  5. 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.

Madbrush
  • 387
  • 1
  • 3
  • 9

0 Answers0