Дождитесь окончания всех потоков - передайте каталог файлов
Я использую 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
и т.п.