Как правильно использовать fetch с Promise и блокировками?
Есть класс, который предоставляет статичные методы getEventList и getEventDetails. Первый делает fetch к серверу с целью получить список, содержащий основную информацию о событиях (мероприятиях). Второй также делает fetch к серверу, но с целью получить детальную информацию о конкретном событии.
При этом получаемая информация должна кэшироваться. То есть, например, сначала я вызываю getEventList и список событий записывается в статичную переменную events (массив объектов). Затем, если я вызову getEventDetails, полученная информация о событии должна дополнить уже имеющуюся и в дальнейшем запрос к серверу производиться не должен.
При этом нет никаких гарантий, что getEventList будет вызвана и вернёт результат раньше, чем будет вызвана getEventDetails. Иначе говоря, при вызове getEventDetails также должна проверять, есть ли вообще список событий и если его нет, то загружать. Но в этот момент функция getEventDetails может быть вызвана из другого места, и получится так, что список скачивается дважды, к тому же это приводит к непредсказуемому поведению кода. Пришёл к выводу, что на время загрузки списка нужно устанавливать флаг, сообщающий об этом, и в случае попытки начала повторной загрузки (опять же, например, пока первая ещё не завершилась, а список уже потребовался) просто ждать, когда первый вызов завершит свою работу. А как ждать? setInterval? Промисы?
Прошу прощения, если написал не очень понятно, но у меня уже такая каша в голове по этому поводу, что даже вопрос внятно сформулировать не получается. Если кто-то сможет подсказать, как это всё правильно организовать - буду признателен.
OcelotJungle, если бы порядок был определён чёткой последовательностью, весь скрипт подвисал бы до тех пор, пока данные не загрузятся. Иногда это может длится десятки секунд.
Всё-таки не очень внятно описано что за статичная переменная.
Но в целом я бы в таком случае хранил в 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();
// ...
}