Не можете использовать await для экспортируемой функции? - PullRequest
0 голосов
/ 22 октября 2019

У меня есть оболочка APIService вокруг Axios, и я возвращаю ее и использую .then () для обработки обещания, но теперь я хочу использовать async / await;Интересно, почему моя функция больше не работает в этом новом сценарии;так как я только добавляю пару конфигураций к экземпляру Axios перед его возвратом.

Логика перехода к async / await заключается в том, что это лучший способ использования nextjs и getInitialProps.

My 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 ...

Ответы [ 3 ]

0 голосов
/ 22 октября 2019

Async и Await являются расширениями обещаний. Они фактически построены на основе обещаний. Ожидание нельзя использовать вне функции Async. Запомните эти правила для asunc и await.

  1. Вы должны использоватьКлючевое слово await только в замыкании, которое объявлено с ключевым словом async.
  2. Внутри асинхронного замыкания, если с ключевым словом await вызывается другая асинхронная функция, следующая строка не будет выполняться, пока не будет выполнено обещание этой строки. разрешен.

    асинхронная функция myFunc () {return 10;}

    myFunc (). Then (alert);// ВЫХОД: 10

Async сообщает, что обещание будет возвращено, если обещание не будет возвращено, javascript автоматически помещает его в разрешенную часть. Запуск myFunc (). Then () работает, потому что myFunc возвращает обещание. Если Async и await не работают, попробуйте написать собственное обещание и посмотреть, работает ли оно. Вы можете перейти по этой ссылке Promise - JavaScript

0 голосов
/ 23 октября 2019

Проблема заключалась в том, что API_URL, который я определил, проблема не заключалась в стеке, она была просто как // в пути.

0 голосов
/ 22 октября 2019

await нельзя использовать на верхнем уровне, оно должно быть внутри асинхронной функции. Существует распространенная практика, чтобы решить эту проблему, однако, это не рекомендуется:

(async function() {
  const response = await APIService.get('/endpoint', {});
  ...
}());

// or

(async function() {
  const response = await APIService.get('/endpoint', {});
  ...
}()).then(...);

Есть предложение разрешить асинхронный импорт на верхнем уровне, но он все еще находится на этапе 3. Вы можете прочитать больше по этой теме. в этой статье

...