Как правильно использовать обещания с несколькими потоками писем - PullRequest
0 голосов
/ 21 мая 2018
var promisePipe = require("promisepipe");
var fs = require("fs");
var crypt = require("crypto");
var // ....


files = ['/mnt/Storage/test.txt', '/mnt/Storage/test2.txt', '/mnt/Storage/test3.txt']

var promises = files.map(function(file_enc) {
  return new Promise(function(resolve, reject) {
    var file_out = file_enc + '.locked';
    promisePipe(
      fs.createReadStream(file_enc),
      crypt.createCipheriv(alg, genhashsub, iv),
      fs.createWriteStream(file_out),
    ).then(function(streams){
      console.log('File written: ' + file_out);
      // Promise.resolve(file_out); // tried but doesnt seem to do anything
    }, function(err) {
      if(err.message.substring(0, 7) === 'EACCES:') {
        console.log('Error (file ' + file_out + '): Insufficient rights on file or folder');
      } else {
        console.log('Error (file ' + file_out + '): ' + err);
      }
      // Promise.reject(new Error(err)); // tried but doesnt seem to do anything

    });
  })
});

Promise.all(promises).then(final_function(argument));

Я пытаюсь зашифровать файлы, содержащиеся в массиве с именем files.
. Для простоты я добавил их вручную в этом примере.

Что я хочучтобы произойти:

  1. Создать promises массив для вызова с promises.all при завершении
  2. Итерация по массиву
    1. Создать обещание для этой операции ввода-вывода
    2. Чтение файла \
    3. Шифрование файла - все выполнено с использованием потоков, из-за больших файлов (+ 3 ГБ)
    4. Запись файла /
    5. По окончании записи разрешить обещаниедля этой операции ввода-вывода
  3. Запустить завершающий сценарий, когда все обещания разрешены (или отклонены)

Что происходит:

  1. Шифрованиепервого файла начинается
  2. .then(final_function(argument)) называется
  3. Шифрование первого файла заканчивается

Все файлы правильно шифруются и впоследствии могут быть расшифрованы.
Кроме того, отображаются ошибки, а также подтверждения записи.

Я искал оба стека, как мыКак Google, так и я нашел несколько похожих вопросов (с ответами).Но они не помогают, потому что многие устарели.Они работают, пока я не перепишу их в обещания, а потом я вернусь к тому, с чего начал.

Я также мог бы предложить 8 различных способов выполнения этой задачи, используя модули npm или ванильный код, но все они так или иначе терпят неудачу.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Если в вашем распоряжении уже есть обещание (и, как представляется, promisepipe создает обещание), то обычно не следует использовать new Promise().Похоже, ваша основная проблема в том, что вы создаете обещания, которые никогда не выполняете.

Другая проблема заключается в том, что вы вызываете final_function в последней строке вместо передачи функции, которая вызовет final_function.

Предлагаю попробовать:

var promises = files.map(function(file_enc) {
  var file_out = file_enc + '.locked';

  return promisePipe(
      fs.createReadStream(file_enc),
      crypt.createCipheriv(alg, genhashsub, iv),
      fs.createWriteStream(file_out),
  ).then(function(streams){
     console.log('File written: ' + file_out);

     return file_out;
  }, function(err) {
    if(err.message.substring(0, 7) === 'EACCES:') {
      console.log('Error (file ' + file_out + '): Insufficient rights on file or folder');
    } else {
      console.log('Error (file ' + file_out + '): ' + err);
    }

    throw new Error(err);
  });
});

Promise.all(promises).then(() => final_function(argument));
0 голосов
/ 21 мая 2018

аналог короткого, основанного на файлах процесса, завернутого в обещание всего.Вы можете сделать свое шифрование в «шифровать», который обернут в файловый обработчик.encrypt () возвращает обещание.

сегментов передает массив файлов, требующих работы.

  var filHndlr = function(segment){
    var uri = segment.uri;
    var path = '/tmp/' + uri;
    return that.getFile(path)
      .then (datatss => {
        return that.encrypt(uri, datatss); 
      });
  }
... 

        Promise.all(segments.map(filHndlr))
        .then(resp => { ... });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...