使用来自两个不同异步函数的结果

时间:2019-07-08 03:37:34

标签: node.js function express asynchronous

我正在尝试使用NodeJS学习异步编程,但是在理解如何创建可用函数方面遇到了麻烦。

我正在尝试比较HTTP get请求的结果和在“ express”回调中读取的所有文件的结果。将两个不同的异步操作分解为各自的函数,以便可以在不同的回调中再次使用它们的最佳方法是什么?

当我在Express回调中编写所有内容时,它可以正常工作

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 个答案:

答案 0 :(得分:1)

您需要将这些函数包装在返回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');
  }
});
相关问题