我在Axios周围有一个APIService包装器,我将其返回并使用.then()来处理promise,但是现在我想使用async / await;我不知道为什么我的功能在这种新情况下不再起作用。因为在返回它之前,我只向Axios实例添加了几个配置。
转向异步/等待的逻辑是因为这似乎是使用nextjs和getInitialProps的最佳实践方式。
我的APIService.js;
{
message: "Missing Authentication Token"
}
我希望上面的函数在这样调用时起作用;
import axios from "axios";
import { API_URL } from './constants';
const config = {
baseURL: API_URL,
};
const APIService = axios.create(config);
APIService.interceptors.request.use(request => {
const token = 'blah;
request.headers.Authorization = token ? `Bearer ${token}` : '';
return request;
});
APIService.interceptors.response.use(
response => response,
error => {
if (error.response.status === 401) {
// do something
return true;
}
return Promise.reject(error);
},
);
export default APIService;
在上述情况下,我应该如何重构我的APIService,以及为什么需要重构,因为我没有操纵Axios函数的工作原理...
答案 0 :(得分:0)
await
不能在顶层使用,它必须在异步函数中。有一种常见的做法可以解决此问题,但不建议这样做:
(async function() {
const response = await APIService.get('/endpoint', {});
...
}());
// or
(async function() {
const response = await APIService.get('/endpoint', {});
...
}()).then(...);
有一个建议允许在顶层进行异步导入,但仍处于第3阶段。 您可以在this article
中阅读有关此主题的更多信息。答案 1 :(得分:0)
问题是我定义的API_URL,问题没有冒泡,它就像路径中的double //一样简单。
答案 2 :(得分:-1)
Async和Await是Promise的扩展,它们实际上是在Promise的基础上构建的.Await不能在Async函数之外使用,请记住这些规则用于asunc和await。
在异步闭包中,如果使用await关键字调用了另一个异步函数,则下一行将在该行的承诺解决之前不会运行。
异步函数myFunc(){ 返回10; }
myFunc()。then(alert); //输出:10
异步告诉您将返回承诺,如果未返回承诺,则javascript会自动将其放入已解决的部分。运行myFunc()。then()之所以有效,是因为myFunc返回了诺言。如果Async和await对您不起作用,请尝试编写自定义诺言,看看它是否有效。您可以转到此链接Promise - JavaScript