2016-08-03 42 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