web-dev-qa-db-ja.com

すべてのストリームが終了するのを待ちます-ファイルのディレクトリをストリーミングします

pkgcloudclient.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);
}
10
berg

これを行う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.');
22
JAM

NodeDir を見てください。これには、readFilesStream/promiseFilesなどのメソッドがあります。

0
B.Ma