Вложение async / await влияет на производительность? - PullRequest
0 голосов
/ 20 февраля 2019

давайте рассмотрим, что у нас есть N асинхронных функций, таких как:

async function1(){
  return await fetch(...);
}
.
.
.
async functionN(){
  return await fetch(...);
}

, тогда у нас есть такая функция:

async wrapper(){
   let var = await fetch(...);
   function1();
   .
   .
   .
   functionN();
}

создаст одну большую очередь микрозадач, которая будет эффективно блокировать поток пользовательского интерфейсапереход к следующему заданию до того, как все вызванные функции разрешат свои awaits?

1 Ответ

0 голосов
/ 20 февраля 2019

В очереди для микрозадач ничего нет, пока обещания разрешить .До тех пор другие задачи и события (UI) могут обрабатываться.

Это связано с тем, что оператор await заставит соответствующую функцию async немедленно вернуться, что позволит выполнить другой код JS.В вашем случае обещание возвращается fetch, что на практике не разрешит немедленно .Таким образом, здесь ничего не блокируется.

Тогда, когда HTTP-ответ разрешит обещание fetch, действительно будет создана микрозадача, которая при выполнении восстанавливает соответствующий async контекст выполнения функции.Вашему примеру функции больше нечего делать, так что это быстро делается.

Обратите внимание, что не имеет значения, была ли эта функция первоначально вызвана из какой-либо другой функции: на этом этапе восстанавливается только контекст выполнения этой конкретной функции (в котором разрешено ожидаемое обещание) без какого-либо ранее существующего стека вызовов,Таким образом, он не возвращает снова функции обтекания.Это уже произошло на первом этапе и больше не повторится.

Затем снова происходит бесплатная обработка событий до разрешения следующего обещания fetch.И так продолжается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...