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

时间:2020-01-17 18:59:29

标签: javascript axios dialogflow-es

我正在尝试使用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”。

谢谢。

亲切的问候

3 个答案:

答案 0 :(得分:1)

请注意,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);
      });
  });

答案 1 :(得分:0)

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

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);
}  

答案 2 :(得分:0)

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