【发布时间】:2019-10-22 06:52:22
【问题描述】:
我有一个围绕 Axios 的 APIService 包装器,我返回它并使用 .then() 来处理承诺,但现在我想使用 async/await;我想知道为什么我的功能在这种新情况下不再起作用;因为我在返回之前只向 Axios 实例添加了几个配置。
转向 async/await 的逻辑是因为这似乎是使用 nextjs 和 getInitialProps 的最佳实践方式。
我的 APIService.js;
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;
我希望上述函数在这样调用时能够工作;
import APIService from '../../utils/APIService';
Page.getInitialProps = async function({ res, query }) {
const req = await APIService.get('/endpoint', {});
const { data } = req;
return {
data
};
};
我应该如何重构我的 APIService 以在上述场景中工作,以及为什么需要重构,因为我不操纵 Axios 函数的工作方式...
【问题讨论】:
-
除非用
async函数封装,否则不能在全球范围内使用 -
您只能在
async函数内调用await。您必须在async函数中调用const req = await APIService.get('/endpoint', {});。目前,它不能位于模块的顶层。它必须在函数内部。 -
@EslamAbuHugair - 完全准确地说,模块范围的顶层不是全局范围。它是模块范围。问题是(直到我们在模块中获得顶级
await)您必须在async函数内才能使用await,并且模块范围的顶级不在async函数内。 -
有人可以使用我的代码作为示例来说明我需要如何重写它吗?它是从异步函数内部调用的。我将更新我的代码。
标签: reactjs axios es6-promise next.js