承诺 aws 流

Promisify aws streams

我想从 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);
    })
}

我如何承诺此代码以便在所有文件下载完成后我可以执行一些代码?

谢谢!

对于流,您可以使用 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,一旦您创建的所有 promise 都得到解决,它就会得到解决。