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

Прежде чем мы начнем, вот ссылка на git-repo со всем кодом и примерами из этой статьи. Не стесняйтесь оформлять / использовать / вилку.



Позвольте мне сначала дать некоторую предысторию.

Допустим, нашему приложению требуется токен API, который будет передаваться в заголовках для авторизации. Мы хотели бы получить этот токен до того, как в браузере будут запускаться какие-либо API. Если эти API-интерфейсы работают одновременно, нам нужен какой-то механизм блокировки, который мог бы ждать, пока будет извлечен apiToken, а затем вызывать другие API.

Давайте реализуем это решение и назовем его APILockService.

Сначала мы создаем экземпляр axios

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

Обратите внимание, что метод isLocked () принимает конфигурацию axios в качестве аргументов.

Теперь давайте создадим APILockService.

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

Почему именно lockToken?
Мы берем lockToken в качестве идентификатора запроса, установившего блокировку. Запрос на блокировку сохранит этот токен в своей конфигурации axios. Когда служба заблокирована и API вызывает isLocked (), мы возвращаем false, если lockToken присутствует в конфигурации axios. Для других API мы возвращаем true. Это гарантирует, что API, установивший блокировку, может пройти, блокируя другие.

Следующие запросы API будут использовать waitTillUnlocked () для ожидания снятия блокировки. Этот метод возвращает обещание, которое разрешается, когда блокировка снимается с помощью API блокировки.

Максимальное время блокировки
Если таймаут блокировки API или разработчик забывает снять блокировку, блокировка должна быть снята через 5 минут, как установлено в setTimeOut () функции waitTillUnlocked ().

Теперь, когда наша служба блокировки готова, давайте решим исходную проблему токена приложения. Давайте создадим запрос axios, который принесет нам apiToken.

Обратите внимание, что мы сохраняем lockToken в конфигурации axios.

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

Обычно, если мы хотим реализовать это, нам нужно сделать что-то вроде этого.

getAppToken() 
.then(() => {
  return getAppDate(); 
})

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

// ........ in main app js ....... 
getAppToken(); 
getAppData();

Спасибо за чтение :)