2016-08-03 2 views
0

S3에서 여러 파일을 다운로드하고 일단 다운로드를 완료하면 다른 작업을 수행합니다. 나는 파일을 다운로드하려면 다음 코드를 사용하고 있습니다 :aws 스트림을 알리십시오

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

는 이제 한 번 생성 한 약속을 모두 해결 체인 .thenPromise.all에이

를 해결 할 수 있습니다.

+0

감사! 완벽하게 작동합니다. – Ohad

관련 문제