在 geolocation.getCurrentPosition 中保存对象数据(axios 请求的异步函数)(javascript)
Saving object data in geolocation.getCurrentPosition (async function for axios request) (javascript)
我需要将 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() 中的选项为空 ({})。
如何在回调箭头函数中设置选项数据?
提前致谢!
您已经在回调中设置了选项数据,但尝试以这种方式 console.log 是错误的,实际上在您的代码中,第二个 console.log 将在第一个和第一个之前执行回调本身,你正在调用异步工作的Geolocation Browser API并在完成后调用回调函数,但首先,js引擎将恢复当前执行上下文并完成堆栈中的所有调用,
阅读更多关于:
.....
作为一个简短的回答,您需要在设置数据后立即对选项执行任何操作,您需要 do/call/trigger 在回调中:
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) {
....
}
});
}
}
为了能够 return 此函数的值,我建议您更改代码的结构,您可以将 getCurrentPosition 包装在一个 promise 中,检查此 answer
您可以使用这样的承诺:
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);
}
}
};
我需要将 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() 中的选项为空 ({})。 如何在回调箭头函数中设置选项数据?
提前致谢!
您已经在回调中设置了选项数据,但尝试以这种方式 console.log 是错误的,实际上在您的代码中,第二个 console.log 将在第一个和第一个之前执行回调本身,你正在调用异步工作的Geolocation Browser API并在完成后调用回调函数,但首先,js引擎将恢复当前执行上下文并完成堆栈中的所有调用,
阅读更多关于:
.....
作为一个简短的回答,您需要在设置数据后立即对选项执行任何操作,您需要 do/call/trigger 在回调中:
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) {
....
}
});
}
}
为了能够 return 此函数的值,我建议您更改代码的结构,您可以将 getCurrentPosition 包装在一个 promise 中,检查此 answer
您可以使用这样的承诺:
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);
}
}
};