@OcelotJungle

Как правильно использовать fetch с Promise и блокировками?

Есть класс, который предоставляет статичные методы getEventList и getEventDetails. Первый делает fetch к серверу с целью получить список, содержащий основную информацию о событиях (мероприятиях). Второй также делает fetch к серверу, но с целью получить детальную информацию о конкретном событии.
При этом получаемая информация должна кэшироваться. То есть, например, сначала я вызываю getEventList и список событий записывается в статичную переменную events (массив объектов). Затем, если я вызову getEventDetails, полученная информация о событии должна дополнить уже имеющуюся и в дальнейшем запрос к серверу производиться не должен.
При этом нет никаких гарантий, что getEventList будет вызвана и вернёт результат раньше, чем будет вызвана getEventDetails. Иначе говоря, при вызове getEventDetails также должна проверять, есть ли вообще список событий и если его нет, то загружать. Но в этот момент функция getEventDetails может быть вызвана из другого места, и получится так, что список скачивается дважды, к тому же это приводит к непредсказуемому поведению кода. Пришёл к выводу, что на время загрузки списка нужно устанавливать флаг, сообщающий об этом, и в случае попытки начала повторной загрузки (опять же, например, пока первая ещё не завершилась, а список уже потребовался) просто ждать, когда первый вызов завершит свою работу. А как ждать? setInterval? Промисы?

Прошу прощения, если написал не очень понятно, но у меня уже такая каша в голове по этому поводу, что даже вопрос внятно сформулировать не получается. Если кто-то сможет подсказать, как это всё правильно организовать - буду признателен.
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Che603000
c 2011 javascript
Lynn
@Lynn
nginx, js, css
Всё-таки не очень внятно описано что за статичная переменная.
Но в целом я бы в таком случае хранил в events не объект, а промис и в вызове getEventList проверял, что если переменная есть, то никуда ходить не нужно.
let events = null;

function getEventList() {
    if (events) return events;
    events = fetch(...).then(r => r.json());
    return events;
}

async function getEventDetails() {
    events = await getEventList();
    // ...
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы