Обещания не ждет разрешения или отклонения - javascript - ReactJs - PullRequest
0 голосов
/ 04 ноября 2019

Я использую аутентификацию токена для своего приложения «Спа». Перед тем, как выполнить CRUD-процесс, я проверяю время окончания обновления токенаЕсли токен обновления действителен, нет проблем, но если он не действителен, я отправляю старый токен обновления и получаю новый токен обновления и доступа с сервера перед пересылкой. Нет проблем до этого момента.

Проблема в том, что механизм обновления завершается без ожидания ответа от сервера.

currentUser сохраняет значение токена. Я проверяю нулевой элемент управления для токена, а затем, если срок действия недействителен, я отправляю старый токен обновления.

В этот момент функция возвращается без ожидания ответа authenticationService.createAccessTokenByRefreshToken . Функция должна ждать эту функцию, потому что если токен доступа недействителен, мне нужен новый.

Почему функция завершается без ожидания?

export function authHeader() {
    var authorization = {
        Authorization: ''
    };

    var currentUser = authenticationService.currentUserValue;

    if (currentUser && currentUser.token) {
        const refreshToken = currentUser.refreshToken;
        const expiration = currentUser.expiration;
        var moment = require('moment');
        var now = moment();

        if (moment(now).isAfter(expiration)) {
            authenticationService.createAccessTokenByRefreshToken(refreshToken).then((res) => {
                authorization.Authorization = `Bearer ${res.data.token}`;
                return Promise.resolve(authorization);
            });
        }
        else {
            authorization.Authorization = `Bearer ${currentUser.token}`;
            return Promise.resolve(authorization);
        }

        //return { Authorization: `Bearer ${currentUser.token}` };
    } else {
        return Promise.reject(authorization);
    }
}

Ответы [ 2 ]

5 голосов
/ 04 ноября 2019
if (moment(now).isAfter(expiration)) {
  authenticationService.createAccessTokenByRefreshToken(refreshToken).then((res) => {
    authorization.Authorization = `Bearer ${res.data.token}`;
    return Promise.resolve(authorization);
  });
}

Этот блок кода требует оператора возврата. На данный момент он неявно возвращает неопределенное. Кроме того, небольшая вещь: если вы находитесь в .then, вам не нужно делать Promise.resolve(authorization),, вы можете просто вернуть authorization. .then создает новое обещание для вас.

if (moment(now).isAfter(expiration)) {
  return authenticationService.createAccessTokenByRefreshToken(refreshToken)
    .then((res) => {
      authorization.Authorization = `Bearer ${res.data.token}`;
      return authorization;
    });
}
0 голосов
/ 04 ноября 2019

пожалуйста, начните использовать async await. Это делает вашу жизнь проще и удобочитаемым кодом с меньшим количеством ошибок. Дайте мне знать, если вам подходит следующее:)

const moment = require("moment");

const authHeader = async () => {
  try {
    const authorization = {
      Authorization: ""
    };

    const currentUser = authenticationService.currentUserValue;

    if (currentUser && currentUser.token) {
      const refreshToken = currentUser.refreshToken;
      const expiration = currentUser.expiration;
      const now = moment();

      if (moment(now).isAfter(expiration)) {
        const authResponse = await authenticationService.createAccessTokenByRefreshToken(
          refreshToken
        );
        authorization.Authorization = `Bearer ${authResponse.data.token}`;
      } else {
        authorization.Authorization = `Bearer ${currentUser.token}`;
      }
    }

    return authorization;
  } catch (err) {
    return err;
  }
};

export default authHeader;

...