2016-08-03 47 views
0

我想從S3下載多個文件,並且一旦它們全部完成並下載完成其他操作。 我使用下面的代碼來下載文件: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); 
    }) 
} 

如何promisify這個代碼,所以我可以執行一些代碼,一旦所有文件完成下載?

謝謝!

回答

2

對於流,您可以使用finish事件來確定流已完成。此時,您可以解決承諾。您可以爲此創建承諾的數組:

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)); 
}))); 

現在你可以鏈到.then其中Promise.all一旦解決了所有你所創建的承諾得到解決。

+0

謝謝!完美的作品。 – Ohad