Дождитесь окончания всех потоков - передайте каталог файлов

Я использую client.upload в pkgcloud для загрузки каталога файлов. Каков наилучший способ выполнить обратный вызов после завершения всех потоков? Есть ли встроенный способ зарегистрировать каждое событие "конец" потока и выполнить обратный вызов после того, как все они запущены?

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

2 ответа

Решение

Один из способов сделать это - создать 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.'); });

Посмотрите на NodeDir ,, который имеет такие методы, как readFilesStream / promiseFiles и т.п.

Другие вопросы по тегам