Как «заказать» ваши обратные вызовы без использования блокирующей структуры - PullRequest
0 голосов
/ 26 марта 2019

Я новичок в node.js и stackoverflow, и у меня возникла небольшая проблема: я хочу прочитать два файла и сделать что-то с ними в определенном порядке.Проблема в том, что я не знаю, кто будет первым читать, поэтому я не знаю, как убедиться, что они сработают в правильном порядке.

Чтобы привести пример, скажем, что я хочу прочитатьдва файла и запишите их в ответ:

fs.readFile('./file1',(err,data) => {
    res.write(data);
})
fs.readFile('./file2',(err,data) => {
    res.write(data);
})

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

Я мог бы сделать это:

fs.readFile('./file1',(err,data) => {
    res.write(data);
    fs.readFile('./file2',(err,data) => {
        res.write(data);
    })
})

Но это будет действовать как блокирующая структура: вторая не может начать считываться до конца первой, и это не точка Node.js ... Я прав?

PS: Извините, если вопрос тупой или для моего плохого английского

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Одна из причин (из нескольких) Promise и async/await существует, чтобы решить именно этот тип проблемы.

Вы можете создать оболочку для возврата Promise:

function readSomething(filePath) {
  return new Promise((resolve, reject) => {
    fs.readFile(filePath, (err, data) => {
      if (err) reject(err);
      else resolve(data);
    });
}

Тогда вы можете позвонить, как,

// called in parallel
const result1 = readSomething('./file1');
const result2 = readSomething('./file2');

result1.then((data) => {
  res.write(data) // or anything
  // to order, chaining promise
  return result2;
})
.then(data => res.write(data))

С async/await вы можете сделать (await действует только внутри async function):

async function handleResults() {
  res.write(await result1)
  res.write(await result2)
}

Примечание: следите за ошибками (reject случаи). Они становятся немного хитрыми в этой ситуации. (Я могу это понять)

В nodejs вы также можете использовать мощность EventEmitter. Вы также можете проверить reactive programming реализовано rxjs библиотека для Observer шаблон.

0 голосов
/ 26 марта 2019
let file1 = fs.readFile('./file1')
let file2 = fs.readFile('./file2');
file1 = await file1;
file2 = await file2;
res.write(file1)
res.write(file2)

Это чтение происходит параллельно, но если вы заранее знаете, что file1 будет сравнительно большим, вы можете поменять операторы await. И тогда вы можете написать в любом порядке.

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