Перезапуск очереди запросов API, если произошло обновление токена

Мне трудно обдумать этот шаблон, который я пытаюсь реализовать, поэтому я надеюсь, что сообщество по переполнению стека сможет помочь мне найти решение этой проблемы.

В настоящее время я использую redux-thunk вместе с superagent обрабатывать вызовы мне API и синхронизировать все это с Redux

Примером этого может выглядеть

export const getUser = (id) => {
  return (dispatch) => {
    const deferred = new Promise((resolve, reject) => {
      const call = () => {
        API.get(`/users/${id}`)
        .then((response) => response.body)
        .then((response) => {
          if (response.message === 'User found') {
            serializeUser(response.data).then((response) => {
              resolve(response);
            });
          } else {
            reject('not found');
          }
        }).catch((err) => {
          handleCatch(err, dispatch).then(call).catch(reject)
        });
      }
      call()
    });
    return deferred;
  };
};

В случае, когда сервер возвращается с 200 и некоторыми данными, я продолжаю помещать данные в хранилище и отображать их на странице или в любом другом приложении.

В случае, если я получаю сообщение об ошибке, я попытался написать функцию, которая будет перехватывать их и определять, должна ли она отображать ошибку на странице или в случае 401 из нашего API, попытаться обновить токен, а затем попытаться вызвать метод...

import { refreshToken } from '../actions/authentication';

export default (err, dispatch) => {
  const deferred = new Promise((resolve, reject) => {
    if (err.status === 401) {
      dispatch(refreshToken()).then(resolve).catch(reject)
    } else {
      reject(err);
    }
  })
  return deferred;
};

Это работает, однако, я должен добавить это к каждому вызову, и это не учитывает одновременные вызовы, которые не должны пытаться позвонить, если происходит обновление.

Я видел некоторые вещи в моем исследовании по этой теме, которые, возможно, redux-saga мог бы работать, но я не смог обернуть свой мозг, как я мог бы сделать эту работу

По сути, мне нужно что-то вроде очереди, в которую будут поступать все мои запросы API, которая, возможно, будет отклонена, поэтому любые параллельные запросы будут просто выдвинуты до конца, и после истечения времени ожидания вызовы будут сложены, когда первый вызов получит 401 приостанавливает очередь до тех пор, пока обновление токена не вернется либо успешно, в этом случае оно продолжит очередь, либо с ошибкой, в этом случае он отменяет все будущие запросы из очереди и отправляет пользователя обратно на страницу входа

Здесь меня беспокоит то, что если первый вызов в стеке занимает много времени, я не хочу, чтобы другие вызовы потом долго ждали, потому что это увеличит предполагаемое время загрузки для пользователя.

Есть ли лучший способ справиться с обновлением токенов?

0 ответов

Другие вопросы по тегам