无法在导出的函数上使用等待吗?

时间:2019-10-22 06:52:22

标签: reactjs axios es6-promise next.js

我在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函数的工作原理...

3 个答案:

答案 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。

  1. 您必须仅在使用async关键字声明的闭包中使用await关键字。
  2. 在异步闭包中,如果使用await关键字调用了另一个异步函数,则下一行将在该行的承诺解决之前不会运行。

    异步函数myFunc(){   返回10; }

    myFunc()。then(alert); //输出:10

异步告诉您将返回承诺,如果未返回承诺,则javascript会自动将其放入已解决的部分。运行myFunc()。then()之所以有效,是因为myFunc返回了诺言。如果Async和await对您不起作用,请尝试编写自定义诺言,看看它是否有效。您可以转到此链接Promise - JavaScript