Javascript-在新请求中使用先前请求中的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript-在新请求中使用先前请求中的数据相关的知识,希望对你有一定的参考价值。

我正在尝试使用Dialogflow的InLine编辑器中的Axios执行一些API调用,但无法使其正常工作,您能为我提供帮助吗?

function calc(agent) {
    axios.get('https://maps.googleapis.com/maps/api/geocode/json?address=xxx')
      .then((result) => { 
             const Lat2 = result.data.results[0].geometry.location.lat;
             const Lng2 = result.data.results[0].geometry.location.lng;
      });
    const data = {
       "addresses": [
                {
                    "lat": Lat2,
                    "lon": Lng2,
                }
            ]
        };
    return axios.post('https://api.test.XXXX', data, {
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'YYYYYY'
        }})
    .then((result) => {
      const cant = result.data.total.amount;
            agent.add('This is ' + cant);
    });
    } 

关于数据常量,我无法为Lat2和Lng2变量分配“ lat”和“ lon”。

谢谢。

亲切的问候

答案

注意Lat2Lon2的范围在传递给第一个.then()的函数中。要访问它们,您需要从该函数返回它们,然后再链接另一个.then(),或者您可以在同一函数内移动以后的处理。

承诺链接:

axios
  .get('https://maps.googleapis.com/maps/api/geocode/json?address=xxx')
  .then(result => {
    const Lat2 = result.data.results[0].geometry.location.lat;
    const Lng2 = result.data.results[0].geometry.location.lng;
    return { Lat2, Lng2 };
  })
  .then(({ Lat2, Lng2 }) => {
    const data = {
      addresses: [
        {
          lat: Lat2,
          lon: Lng2
        }
      ]
    };

    return axios.post('https://api.test.XXXX', data, {
      headers: {
        'Content-Type': 'application/json',
        Authorization: 'YYYYYY'
      }
    });
  })
  .then(result => {
    const cant = result.data.total.amount;
    agent.add('This is ' + cant);
  });

稍后在同一函数中处理:

axios
  .get('https://maps.googleapis.com/maps/api/geocode/json?address=xxx')
  .then(result => {
    const Lat2 = result.data.results[0].geometry.location.lat;
    const Lng2 = result.data.results[0].geometry.location.lng;

    const data = {
      addresses: [
        {
          lat: Lat2,
          lon: Lng2
        }
      ]
    };

    return axios
      .post('https://api.test.XXXX', data, {
        headers: {
          'Content-Type': 'application/json',
          Authorization: 'YYYYYY'
        }
      })
      .then(result => {
        const cant = result.data.total.amount;
        agent.add('This is ' + cant);
      });
  });
另一答案

也许尝试异步/等待方法:

async function calc(agent) {
    const result = await axios.get('https://maps.googleapis.com/maps/api/geocode/json?address=xxx') 
    const Lat2 = result.data.results[0].geometry.location.lat;
    const Lng2 = result.data.results[0].geometry.location.lng;
    const data = {
        "addresses": [
            {
                "lat": Lat2,
                "lon": Lng2,
            }
        ]
    };
    const result2 = await axios.post('https://api.test.XXXX', data, {
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'YYYYYY'
        }})
    const cant = result2.data.total.amount;
    agent.add('This is ' + cant);
}  
另一答案

您为什么不在首次通话的then子句中拨打下一个电话?这些axios调用是异步的,这意味着您的第一个调用的then子句将在其下面编写的代码之后执行。请参阅本文以了解异步调用的工作方式:https://medium.com/codebuddies/getting-to-know-asynchronous-javascript-callbacks-promises-and-async-await-17e0673281ee

以上是关于Javascript-在新请求中使用先前请求中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RxAlamofire 取消先前的请求?

使用SwitchMap()处理取消先前的请求

如果先前的请求未经授权,如何执行快速合并请求

使用 axios 和 vue.js 取消先前的请求

用户先前不允许后如何再次请求麦克风访问权限?

如果收到新请求,如何取消先前的任务?