Node.js читает файл, используя async / await - PullRequest
0 голосов
/ 04 января 2019

Я экспериментирую с асинхронным / ожидающим кодом для чтения файла.Вот мой код:

var fs = require('fs');

function readFile(fileName) {
  return new Promise(resolve => {
    //console.log(test);
    fs.readFile(fileName, 'utf8', function (err, data) {
      if (err) throw err;

      console.log(fileName)
      console.log(data)
    })
    resolve();
  });
}

async function run() {
  await readFile('file1.txt');
  await readFile('file2.txt');
  readFile('file3.txt');
}

run();

Но результат все равно случайный.Это означает, что file3 когда-нибудь читается перед file2.Где я делаю не так?

1 Ответ

0 голосов
/ 04 января 2019

Есть много способов достичь этого.

Большинство из них описаны в по этой ссылке

Я напишу простой:

1), используя util.promisify для преобразования метода обратного вызова в обещание:

const fs = require('fs');
const util = require('util');
const readFile = (fileName) => util.promisify(fs.readFile)(fileName, 'utf8');

(async () => {
  try {
    const files = ['file1.txt', 'file2.txt', 'file3.txt'];
    for (const file of files) {
      console.log(
        await readFile(file)
      );
    }
  }
  catch (error) {
    console.error(error);
  }
})();

2) *Sync методы.Поскольку ваш код не имеет отношения к параллелизму, вы можете использовать *Sync методы:

const fs = require('fs');

try {
  const files = ['file1.txt', 'file2.txt', 'file3.txt'];
  for (const file of files) {
    console.log(
      fs.readFileSync(file, 'utf8')
    );
  }
}
catch (error) {
  console.error(error);
}

Кстати.Вот Ваш фиксированный код:

var fs = require('fs');

function readFile(fileName) {
  return new Promise((resolve, reject) => {
    fs.readFile(fileName, 'utf8', function (error, data) {
      if (error) return reject(error);

      console.log(fileName)
      console.log(data)

      resolve();
    })
  });
}

async function run() {
  await readFile('file1.txt');
  await readFile('file2.txt');
  await readFile('file3.txt');
}

run();

, так как Вы вызываете readFile и решаете в той же последовательности асинхронного вызова, что он вызывается в то же время, что является причиной race condition.

Выждать обработки обратного вызова и затем разрешать ее (в области обратного вызова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...