Promisify aws流

时间:2016-08-03 15:41:29

标签: node.js amazon-s3 promise aws-sdk

我想从S3下载多个文件,一旦完成下载就做其他事情。 我使用以下代码下载文件:

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

如何宣传此代码,以便在完成所有文件下载后执行一些代码?

谢谢!

1 个答案:

答案 0 :(得分: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,这会在您创建的所有承诺得到解决后解决。