【问题标题】:Saving object data in geolocation.getCurrentPosition (async function for axios request) (javascript)在 geolocation.getCurrentPosition 中保存对象数据(axios 请求的异步函数)(javascript)
【发布时间】:2021-01-24 17:37:02
【问题描述】:

我需要将 position.coords.(latitude/longitude) 存储在 navigator.geolocation.getCurrentPosition() 之外声明的对象内。

async axiosRequest (usage) {
    var options = {}
    ...
    } else if (usage === 'gps') {
      navigator.geolocation.getCurrentPosition((position) => {
        options = {
          method: 'GET',
          url: 'https://api.waqi.info/feed/geo:' + position.coords.latitude + ';' + position.coords.longitude + '/',
          params: {
            token: process.env.VUE_APP_AICQN_API_KEY
          }
        console.log(options) // {...} that's work !!
        }
      });
      console.log(options) // {} ???
    }
    ...
    try {
      const response = await axios.request(options)
      return response.data
    } catch (error) {
      console.error(error)
    }
}

我不明白为什么 console.log() 中的选项是空的 ( {} )。 如何在回调箭头函数中设置选项数据?

提前致谢!

【问题讨论】:

    标签: javascript object async-await geolocation


    【解决方案1】:

    你可以使用这样的承诺:

    import { request } from "axios";
    
    const axiosRequest = async (usage) => {
      if (usage === "gps") {
        let getCurrentPositionOptions = new Promise((resolve, reject) => {
          navigator.geolocation.getCurrentPosition((position) => {
            const options = {
              method: "GET",
              url:
                "https://api.waqi.info/feed/geo:" +
                position.coords.latitude +
                ";" +
                position.coords.longitude +
                "/",
              params: {
                token: process.env.VUE_APP_AICQN_API_KEY
              }
            };
            return resolve(options);
          });
        });
    
        const options = await getCurrentPositionOptions;
        console.log(options);
    
        if (!options) return false;
    
        try {
          const response = await request(options);
          return response.data;
        } catch (error) {
          console.error(error);
        }
      }
    };
    

    您可以看到一个工作示例here。你可以阅读 more 关于 Promise 的内容。

    【讨论】:

      【解决方案2】:

      您已经在回调中设置了选项数据,但是尝试以这种方式 console.log 是错误的,实际上在您的代码中,第二个 console.log 将在第一个和回调本身之前执行,您正在调用Geolocation Browser API 异步工作,完成后调用回调函数,但首先js引擎会恢复当前执行上下文并完成堆栈中的所有调用,

      阅读更多:

      Asyncrounouse JS,

      Event Loop,

      ....

      简而言之,设置数据后您需要立即对选项执行的任何操作,都需要在回调中执行/调用/触发:

      async axiosRequest (usage) {
          var options = {}
          ...
          } else if (usage === 'gps') {
            navigator.geolocation.getCurrentPosition((position) => {
              options = {
                method: 'GET',
                url: 'https://api.waqi.info/feed/geo:' + position.coords.latitude + ';' + position.coords.longitude + '/',
                params: {
                  token: process.env.VUE_APP_AICQN_API_KEY
                }
              };
         
              try {
                const response = await axios.request(options)
                ....
              } catch (error) {
                ....
              }
            });
          }
      }
      

      为了能够从这个函数返回一个值,我建议你改变你的代码结构,你可以将 getCurrentPosition 包装在一个 Promise 中,检查这个answer

      【讨论】:

      • 感谢您的回答,但我有一个问题,我在一个函数内....如果我在 try { } 中返回,我在回调函数之外返回数据,但我的数据在哪里去?我如何将其存储在选项中?感谢您的回答,不胜感激。
      • 请检查我提到的答案,您也可以在此处检查您的问题的其他答案,他们展示了如何将 API 调用包装在承诺中,因此您可以使用 await 来等到它完成,然后你可以正常从你的函数返回
      • 你说得对,>我不明白我必须做什么。我已经解决了承诺。
      猜你喜欢
      • 2021-03-25
      • 2020-07-21
      • 2021-08-10
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2019-06-22
      • 2014-05-20
      相关资源
      最近更新 更多