fs.createReadStream l oop не завершается - PullRequest
1 голос
/ 06 августа 2020

Я просматриваю объект, содержащий локальные файлы, каждый из которых определенно существует, читаю их в буфер и увеличиваю счетчик по завершении каждого из них. Проблема в том, что, несмотря на то, что нужно прочитать 319 файлов, вывод счетчика на консоль редко, если вообще когда-либо, показывает, что он проходит через все из них. Он загадочным образом останавливается где-то в 200-х ... каждый раз по-разному и без каких-либо ошибок.

У меня это работает в электронном проекте, и встроенное приложение работает без проблем на Ma c, но не работает через это л oop на windows! Я недавно обновил все пакеты, прошел через другие области и внес необходимые корректировки, и все приложение работает отлично ... кроме этого, и это сводит меня с ума!

Вот код:

$.each(compare_object, function(key, item) {
    console.log(item.local_path); // this correctly prints out every single file path
    var f = fs.createReadStream(item.local_path);

    f.on('data', function(buf) {
        // normally some other code goes in here but I've simplified it right down for the purposes of getting it working!
    });

    f.on('end', function(err) {
        num++;
        console.log(num); // this rarely reached past 280 out of 319 files. Always different though.
    });

    f.on('error', function(error) {
        console.log(error); // this never fires.
        num++;
    });
});

Мне интересно, есть ли кеш, который исчерпывается, или я должен уничтожать буфер каждый раз после 'end', но ничто из того, что я читал, не предполагает этого, и даже когда я пытался, это не имело значения. Многие из примеров ожидают, что вы где-то его разместите, а я нет. В полном коде он создает ha sh полного файла и добавляет его к объекту для каждого из локальных файлов.

1 Ответ

1 голос
/ 17 августа 2020

Я считаю, что l oop здесь завершается. Проблема: вы добавляете обработчики asyn c. Самое простое возможное решение - переписать код без потоков.

const fs = require('fs')
const util = require('util')


const asyncReadFile = util.promisify(fs.readFile)

//.. this loop goes into some function with async or you can use readFileAsync
for (let [key, item] of Object.entries(compare_object)) {
  const data = await asyncReadFile(item.local_path)
  ///. here goes data handling
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...