2016-08-03 33 views
0

Ich möchte mehrere Dateien von S3 herunterladen und sobald sie alle zum Download fertig sind etwas anderes tun. Ich verwende den folgenden Code zum Download der Dateien:Promisify aws streams

function downloadFiles(folder, files) { 

    var params = { 
     Bucket: bucket 
    } 

    files.forEach(function (file) { 
     params.Key = folder + '/' + file; 
     var fileStream = fs.createWriteStream(config.s3_downloaded_files_folder + file); 
     S3.getObject(params).createReadStream().pipe(fileStream); 
    }) 
} 

Wie promisify ich diesen Code, so kann ich einige Code ausführen, wenn alle Dateien herunterladen, fertig?

Danke!

Antwort

2

Bei Streams können Sie mithilfe des Ereignisses finish feststellen, dass der Stream beendet wurde. An diesem Punkt können Sie das Versprechen lösen. Sie können eine Reihe von Versprechungen für diese erstellen:

Promise.all(files.map(file => new Promise((resolve, reject) => { 
    const fileParams = Object.assign({Key: folder + "/" + file}, params); 
    let fileStream = fs.createWriteStream(config.folder + file); 
    S3.getObject(params).createReadStream().pipe(fileStream); 
    file.on("finish",() => resolve()); 
    file.on("error", err => reject(err)); 
}))); 

Jetzt können Sie Kette .then-Promise.all, die alle den Versprechungen einmal gelöst ist Sie sind entschlossen, erstellt haben.

+0

Danke! Funktioniert perfekt. – Ohad