Выполнить строку в конце сценария узла? - PullRequest
0 голосов
/ 27 мая 2018

Я написал скрипт, который рекурсивно асинхронно изменяет js-файлы в каталоге.Он состоит из функции search(dirname), которая выполняет поиск в каталоге файлов js, и функции modify(filename), которая выполняет изменение.

let totalFilesSearched = 0;

const search = (dir) => {
    fs.readdir(dir, (err, list) => {
        if (err) return;
        list.forEach((filename) => {
            const filepath = path.join(dir, filename);
            if (filename.endsWith('.js')) {
                modify(filepath);
            } else if (fs.lstatSync(filepath).isDirectory()) {
                search(filepath);
            }
        })
    });
}

const modify = (filename) => {
    fs.readFile(filename, 'utf8', (err, data) => {
        if (err) console.log(err);
        // ... my modification code ...
        totalFilesSearched++;
    });
}

search(args[0])
console.log(`Total files searched: ${totalFilesSearched}`);

Я хочу распечатать totalFilesSearched в конце моегосценария, но так как мой код асинхронный, он просто печатает Total files searched: 0 сразу.

Кто-нибудь знает, как я буду ждать, пока сценарий заканчивается, чтобы распечатать это?У меня проблемы, потому что обе мои функции search() и modify() асинхронны.

Ответы [ 2 ]

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

Самоответ:

Просто используйте process.on('exit', callback_function_to_execute_at_end)

Он встроен в узел, и ваш обратный вызов будет выполнен прямо перед выходом из процесса.

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

Вместо этого используйте Promises, а затем позвоните console.log, когда все решится.Используйте promisify, чтобы превратить обратные вызовы в обещания:

const { promisify } = require('util');
const readFile = promisify(fs.readFile);
const readDir = util.promisify(fs.readdir);

const search = (dir) => (
  readDir(dir).then((list) => (
    Promise.all(list.map((filename) => {
      const filepath = path.join(dir, filename);
      if (filename.endsWith('.js')) {
        return modify(filepath); // recursively return the promise
      } else if (fs.lstatSync(filepath).isDirectory()) {
        return search(filepath); // recursively return the promise
      }
    }))
  ))
  .catch(err => void 0)
);

const modify = (filename) => (
  readFile(filename, 'utf8')
    .then((data) => {
      // other code
      totalFilesSearched++;
    }).catch(err => console.log(err))
)

search(args[0])
  .then(() => {
    console.log(`Total files searched: ${totalFilesSearched}`);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...