#javascript #async-await
Вопрос:
Я пытаюсь заменить существующий вызов функции на тот, который вызывает родительский фрейм postMessage и получает другое связанное сообщение postMessage со значением.
Я стараюсь как можно меньше нарушать существующий код, поскольку в нем есть пара сотен строк, где он вызывается.
Текущий код выглядит следующим образом…
function thisfunc(){
return checksomethingincurrentpage()
}
if(thisfunc() == 'something')
// do something
// do something else
При переключении на отправку/получение почтового сообщения от родительского fraome, может ли функция thisfunc() так или иначе не возвращаться до тех пор, пока не будет получено соответствующее почтовое сообщение, и делать это по тому же пути выполнения?
Я пытался сделать что-то подобное, но, похоже, это не работает. (У меня больше нет тестового кода)
//pseudocode...
resolvefunc = null;
function getprom()
prom = new promise
set resolvingfunc equal to resolve function
postmessagecall;
return prom;
async function thisfunc()
response = await getprom();
return response;
eventListener for post message
receive post message
resolvefunc(postmessagepayload)
if(thisfunc() == 'something')
// something
Я видел, что XMLHttpRequest можно сделать синхронным, но в данном случае это не помогает с отправкой сообщений.
Возможно ли это? Как?
Комментарии:
1. Нет, этого не может быть. Лучшее, что он может сделать, — это вернуть обещание, но тогда вызывающий абонент должен выполнить обещание соответствующим образом. Если
if
оператор находится в функции, вы можете сделать его асинхронным и выполнитьif (await thisfunc() === 'something') { ... }
.2. @FelixKling итак, единственный возможный вариант — это цепочка обратных вызовов? Конечно, внесение этого изменения в существующую кодовую базу было бы большой работой, поэтому старайтесь избегать этого. Я пойму, если это невозможно. Я пытаюсь использовать «спящий» подход, используя цикл, но я считаю, что это может заблокировать обработку события postmessage… ?
3. Да, если вы активно заблокируете поток, то ничего не будет работать. Хотя я бы не назвал это цепочкой обратного вызова. С помощью async/await обещания могут обрабатываться довольно прозрачно. Конечно, я не знаю, как выглядит ваша кодовая база, но добавление
await
там, где это необходимо, может быть выполнимым?4. @FelixKling я понимаю, что await работает только внутри асинхронной функции, поэтому потребуется сделать родительскую асинхронную. Я не думаю, что это сработало бы для нас в большинстве случаев, но я рассмотрю ситуации, когда это было бы необходимо.
5. Нет, это не так.