Как общаться между вкладками браузера js?

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

Я пробывал использовать синхронизацию через localStorage и window.postMessage, но это не сработало в моем случае.
Так как у меня несколько вкладок могут начать обновлять токен одновременно, и тогда начинаются проблемы.

Первая вкладка проверяет в localStorage обновляет токен, в ответе isLoading = false. Вторая вкладка тоже в это время проверяет, и isLoading = false. В итоге обе вкладки отправит запросы для обновления токена на сервер, один токен обновится, а во второй вкладке ответ от сервера будет 404, и тогда либо делать редирект на страницу аутентификации, либо выводишь ошибку и просить повторить попытку.

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

Как можно реализовать это, какое хранилище можно использовать?
  • Вопрос задан
  • 972 просмотра
Решения вопроса 1
profesor08
@profesor08 Куратор тега JavaScript
https://developer.mozilla.org/ru/docs/Web/API/Wind...

Получаешь токен, пихаешь в localStorage, при этом все остальные вкладки получают событие storage. А значит, просто слушая этот ивент, ты сможешь обновить токен где тебе надо, на всех вкладках.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@rPman
в похожей ситуации я реализовывал семафор следующим способом
if(localstorage['имя_семафора']++>1)
{ // значит этот семафор уже кто то занял,
  localstorage['имя_семафора']--;
  //  ждем некоторое время и повторяем попытку
}  else
{ // никто семафор не занял можно работать
  ...
  // по окончанию работы семафор надо освободить
  localstorage['имя_семафора']--;
}
смысл в том что localstorage[]++ это атомарная операция (вот в этом месте я скорее всего не прав), а благодаря тому что единственная опасная операция, которая могла бы вклиниться между работай с localstorage и if - это --, и она проихойдет когда семафор и так должен освободиться, т.е. проблем это не создаст.

p.s. почему говорю семафор а не мьютекс, потому что можно сравнивать не только с 1 но и большим числом - это определит, сколько одновременно можно ресурс занимать
p.p.s. в интернете гуляет реализацию мьютекс на javascrit как раз на localstorage но она какая то переусложненная и я не понимаю зачем
если кто то по умнее, объясните пожалуйста
Ответ написан
Комментировать
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
SummerWeb Ярославль
от 120 000 до 180 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
Market-place Ростов-на-Дону
от 100 000 до 200 000 ₽
23 июн. 2024, в 07:50
40000 руб./за проект
23 июн. 2024, в 07:31
600 руб./в час
23 июн. 2024, в 05:23
1500 руб./за проект