pkgcloud の client.upload を使用してファイルのディレクトリをアップロードしています。すべてのストリームが終了した後にコールバックを実行するための最良の方法は何ですか?各ストリームの「終了」イベントを登録し、すべてが起動した後にコールバックを実行する組み込みの方法はありますか?
var filesToUpload = fs.readdirSync("./local_path"); // will make this async
for(let file of filesToUpload) {
var writeStream = client.upload({
container: "mycontainer,
remote: file
});
// seems like i should register finish events with something
writeStream.on("finish", registerThisWithSomething);
fs.createReadStream("./local_path/" + file).pipe(writeStream);
}
これを行う1つの方法は、アップロードごとに Promise
タスクを生成し、 Promise.all()
を利用することです。
ES6を使用しているとすると、コードは次のようになります。
const uploadTasks = filesToUpload.map((file) => new Promise((resolve, reject) => {
var writeStream = client.upload({
container: "mycontainer,
remote: file
});
// seems like i should register finish events with something
writeStream.on("finish", resolve);
fs.createReadStream("./local_path/" + file).pipe(writeStream);
});
Promise.all(uploadTasks)
.then(() => { console.log('All uploads completed.'); });
または、 async / await
-これを利用できます。例えば:
const uploadFile = (file) => new Promise((resolve, reject) => {
const writeStream = client.upload({
container: "mycontainer,
remote: file
});
writeStream.on("finish", resolve);
fs.createReadStream("./local_path/" + file).pipe(writeStream);
}
const uploadFiles = async (files) => {
for(let file of files) {
await uploadFile(file);
}
}
await uploadFiles(filesToUpload);
console.log('All uploads completed.');
NodeDir を見てください。これには、readFilesStream
/promiseFiles
などのメソッドがあります。