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

Я использую 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);
}

person berg    schedule 14.05.2016    source источник
comment
Вы можете использовать async.js для такого рода проблем. Вы можете использовать метод, предоставляемый async.js, как async.waterfall(). Результат одной функции будет передан другой в качестве аргументов обратного вызова. Вам следует ознакомиться с его документацией.   -  person Kartikeya Sharma    schedule 14.05.2016


Ответы (2)


Один из способов сделать это — сгенерировать Promise< /a> для каждой загрузки, а затем использовать 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.');
person JAM    schedule 14.05.2016
comment
Для тех, кому интересно, у меня была немного другая проблема при обработке потоков в hummus.js, и этот ответ помог мне решить мою проблему! Спасибо @JAM, моя проблема: stackoverflow.com/questions/51731191/ - person Jay Edwards; 08.08.2018

Взгляните на NodeDir, в котором есть такие методы, как readFilesStream/promiseFiles и т. д.

person B.Ma    schedule 10.02.2018