Использование результатов двух разных асинхронных функций - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь изучить асинхронное программирование с NodeJS, и у меня возникают проблемы с пониманием того, как создавать полезные функции.

Я пытаюсь сравнить результаты HTTP-запроса на получение и файла, прочитанного все внутри "экспресс" обратного вызова.Каков наилучший способ разделить две разные асинхронные операции на их собственные функции, чтобы их можно было снова использовать вместе в другом обратном вызове?

У меня это работает, когда я пишу все внутри экспресс-обратного вызова

app.get('/', (req, res) => {
    axios.get('http://127.0.0.1:8080')                                                                                                                                                                                                                           
        .then(function(response) {                                                                                                                                                                                                                                    
            var http_data = response.data 
            // Do more stuff with data                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
            fs.readFile('fwversion_current', 'utf8', function(err, contents) {
            var file_data = contents.trim() 
            // Do more stuff with data
            if (http_data == file_data) {
                res.send("Match")
            }
            else {
                res.send("No Match")
            }
        });
});

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

function getHttpData() {
    axios.get('http://127.0.0.1:8080')                                                                                                                                                                                                                            
        .then(function(response) {                                                                                                                                                                                                                                    
            var http_data = response.data 
            // Do more stuff with data    
            return http_data
         });
}

function getFileData() {
    fs.readFile('fwversion_current', 'utf8', function(err, contents) {                                                                                                                                                                                            
        var file_data = contents.trim() 
        // Do more stuff with data
        return file_data
    });
}

app.get('/', (req, res) => {
    let http_data = await getHttpData()
    let file_data = await getFileData()

    if (http_data == file_data) {                                                                                                                                                                                                                                 
        res.send("Match")                                                                                                                                                                                                                                     
    }                                                                                                                                                                                                                                                         
    else {                                                                                                                                                                                                                                                        
        res.send("No Match")                                                                                                                                                                                                                                  
    }                                                                                                                                         
});

1 Ответ

1 голос
/ 08 июля 2019

Вам нужно будет обернуть эти функции внутри функции, которая возвращает Promise, это даст вам возможность await для их завершения, прежде чем продолжить.

function getHttpData(url) {
  // axios.get already returns a Promise so no need to wrap it
  return axios.get(url)
    .then(function(response) {
      let http_data = response.data;
      // Do more stuff with data
      return http_data;
    });
}

function getFileData(path) {
  return new Promise(function(resolve, reject) {
    fs.readFile(path, function(err, contents) {
      if (err) {
        reject(err);
        return;
      }
      let file_data = contents.trim();
      // Do more stuff with data
      resolve(file_data);
    });
  });
}

Теперь, когда оба functions возвращают Promise, мы можем await завершить их.

Сделайте обработчик async function, потому что необходимо использовать await keyword, я использую Promise.all для одновременного запуска обоих запросов и не ожидаю завершения одного, прежде чем мы запустим другой .

Оберните его в try catch для обработки errors и отправьте статус 500

app.get('/', async (req, res) => {
  try {
    const [http_data, file_data] = await Promise.all([
      getHttpData(url),
      getFileData(path),
    ]);

    http_data == file_data
      ? res.send('Match')
      : res.send('No Match');
  } catch (err) {
    console.error(err);
    res.status(500).send('Something went wrong');
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...