@kirill-93

Как правильно дождаться ответа на postMessage?

Есть в проекте 2 случая, когда происходит общение между вкладками или окнами.
1 случай: на сайте имеется айфрейм. Этот айфрейм запрашивает у родительского окна некоторую информацию, которую сам получить не может. Запрашивает postMessage'м и ответ тоже получает postMessage'м.
2 случай: механизм, который шарит sessionStorage между вкладками. Идея состоит в том, что новая вкладка отправляет запрос на получение данных сессии, эмитируя в других вкладках событие onstorage, а другие вкладки отправляют нужные данные.
Оба сценария хорошо работают, но так как в postMessage и onstorage не предусмотрено получение ответа, то все делается с помощью setTimeout с потолка.

Грубо говоря вот так:
//Устанавливаем обработчик postMessage'a
window.addEventListener('message', e => {
    if (e === 'setReferrer') {
        //...
    }
});

//Отправляем запрос в родительский фрейм
parent.postMessage('getReferrer', '*'); 

setTimeout(() => {
    //Выполняем скрипт через 200мс, надеясь, что referrer уже пришел.
}, 200);


Вот эти 200мс меня смущают. Понятно, что общение происходит тут, локально между окнами. Но может ли что-то увеличить задержку?
  • Вопрос задан
  • 154 просмотра
Пригласить эксперта
Ответы на вопрос 2
Xuxicheta
@Xuxicheta
инженер

Оба сценария хорошо работают, но так как в postMessage и onstorage не предусмотрено получение ответа


А что мешает отправить такой же postMessage с ответом назад?
Ответ написан
@vladdimir
Верстальщик
На случай беды, можно сделать рекурсивный таймАут и слушать несколько раз.
То есть, выполняете каждые 200 (20 или n)ms, пока не придет ответ или ошибка. Затем обнуляете таймер. Также, можно поставить верхний порог таймаута, при котором больше нет смысла это делать - если полный зависон на другой стороне.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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