Перезапуск очереди запросов 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 приостанавливает очередь до тех пор, пока обновление токена не вернется либо успешно, в этом случае оно продолжит очередь, либо с ошибкой, в этом случае он отменяет все будущие запросы из очереди и отправляет пользователя обратно на страницу входа
Здесь меня беспокоит то, что если первый вызов в стеке занимает много времени, я не хочу, чтобы другие вызовы потом долго ждали, потому что это увеличит предполагаемое время загрузки для пользователя.
Есть ли лучший способ справиться с обновлением токенов?