Можно ли заменить существующий вызов синхронной функции на вызов, основанный на async/await?

#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. Нет, это не так.