var TOKEN = "";
async function getToken() {
axios
.post(url, data)
.then((response) => {
TOKEN = response.data.token;
})
.catch((error) => {
console.log("failed to login");
});
}
代码应该获取一个令牌,该令牌将用于进一步的请求,例如:
await getToken();
await getSomethingUsingToken();
但是令牌没有保存到变量中。 我也尝试过:
async function getToken() {
let token;
axios
.post(url, data)
.then((response) => {
token = response.data.token;
})
.catch((error) => {
console.log("failed to login");
});
return token;
}
代码是从 Discord 机器人调用的。
由于 axios 请求的异步特性,它没有被保存。在第二个示例中,您在 axios 的 Promise 解析之前返回令牌,因此它返回未定义。
要解决此问题,您可以使用异步/等待模式。所以修改 getToken 函数如下:
var TOKEN = "";
async function getToken() {
try {
const response = await axios.post(url, data);
TOKEN = response.data.token;
return TOKEN;
} catch (error) {
console.log("failed to login");
throw error;
}
}
通过此更改,当您使用await getToken()时,JavaScript将等待Axios请求完成,然后继续执行下一行,确保在继续getSomethingUsingToken之前更新TOKEN值。
当你调用该函数时,你可以这样做:
try {
await getToken();
await getSomethingUsingToken();
} catch (error) {
console.log('There was an error.');
}
最后等待需要异步,因此如果事件处理程序位于不和谐的事件处理程序内,请确保事件处理程序是异步的