使用axios返回undefined的GET请求

时间:2018-01-10 14:24:15

标签: javascript http typescript asynchronous

我尝试使用以下内容执行get请求:

router.get('/marketUpdates',((request, response) => {
  console.log("market updates");
  var data: Order[]
  axios.get('http://localhost:8082/marketUpdates')
  .then(function (response) {
    console.log("GET Response")
    console.log(response.data);
    data = response.data;
  })
  .catch(function (error) {
    console.log("Error in fetching market updates");
  });  

  console.log("Data before sending is ")
  console.log(data);
  response.send(data);
}))

但是,我在底部附近的console.log在.then。

中的console.log之前执行

数据在发送时未定义。有谁知道我怎么能避免这个?

2 个答案:

答案 0 :(得分:3)

  1. 他的代码是异步的,因此请求下面的所有代码都会在请求等待响应时执行。你可以从axios.get
  2. 的底部avoe移动日志
  3. then中的数据与您发送的data不一样......您正在使用function(response)而不是箭头功能。 (response) => {}所以你要绑定另一个。
  4. 以这种方式尝试:

    router.get('/marketUpdates',((request, response) => {
      console.log("market updates");
      let data: Order[]
      console.log("Data before sending is ")
      console.log(data);
      axios.get('http://localhost:8082/marketUpdates')
      .then((getResponse) => {
        console.log("GET Response")
        console.log(getResponse.data);
        data = getResponse.data;
        response.send(data);
      })
      .catch(function (error) {
        console.log("Error while fetching market updates");
      });  
    }))
    

答案 1 :(得分:3)

发送到服务器的请求始终是异步的。这意味着,当服务器响应时,将执行函数.then()

让我重新格式化您的代码:

router.get('/marketUpdates',((request, response) => {
  console.log("market updates");

  var data: Order[];

  console.log("Data before sending is ")
  console.log(data);

  axios.get('http://localhost:8082/marketUpdates')
  .then((response) => {
    console.log("GET Response")
    console.log(response.data);
    data = response.data;

    response.send(data);
  })
  .catch(function (error) {
    console.log("Error in fetching market updates");
  });  
}))

使用行axios.get('http://localhost:8082/marketUpdates'),您将向服务器发出请求,该服务器将响应,但这需要时间。当程序等待服务器响应时,JavaScript不会阻止它执行该函数以保持用户界面运行。

所以.get返回一个Promise,它包含几个在不同场景中调用的函数。一旦服务器返回200和响应,就会调用作为.then的第一个参数给出的函数。

这意味着只要axios触发对服务器的调用,就会执行代码底部的日志。此时没有数据,因为服务器尚未响应。