Может ли блокирующий обратный вызов в асинхронном методе вызывать сбои в работе пользовательского интерфейса? - PullRequest
0 голосов
/ 14 января 2020

Я только что прочитал статью об асинхронном программировании и событии l oop. Во время чтения он описывает, что если я вызову асинхронный метод и передам ему обратный вызов, например, запрос Ajax, веб-API будет обрабатывать событие. Событием в этом случае будет Ajax запрос на получение сообщения. Когда событие вызывается, оно добавляется в очередь событий, а когда стек вызовов пуст и вызывается очередь событий, вызывается обратный вызов из события.

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

Редактировать: я только что понял, что могу проверить свою теорию, открыв браузер и протестировав ее сам, создав

setTimeout(function(){
   while(true){}
}, 500)

при наборе текста это, пользовательский интерфейс будет зависать.

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

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Асинхронный код в конечном итоге будет выполняться в основном потоке. Таким образом, пока асинхронный код будет выполняться в основном потоке, основной поток будет зависать. Это означает, что никакой другой код не может быть запущен. Асинхронный код не начнет выполняться сразу. Он будет ждать, пока не придет время, и когда придет время для выполнения асинхронного кода, он будет выполняться синхронно .

Позвольте мне перейти к предоставленному вами примеру.

setTimeout(function(){
   while(true){}
}, 500)

Обратный вызов, который вы предоставили setTimeout, не будет выполнен, пока не пройдет 500 миллисекунд. Когда время ожидания истечет, механизм javascript загрузит функцию обратного вызова в основной поток для выполнения. Поскольку это бесконечный l oop, основной поток будет заблокирован на бесконечное количество времени. Никакой другой код не будет иметь возможности быть выполненным.

0 голосов
/ 14 января 2020

Да, ваша интуиция верна.

Поскольку javascript является однопоточным, любая работа, выполненная во время поворота события l oop, заблокирует пользовательский интерфейс.

Преимущество вызовов asyn c, подобных Ajax, заключается в том, что вашему сценарию фактически не нужно выполнять какую-либо работу, пока он ожидает ответа от сети. Лучше дать контроль во время ожидания, освобождая интерфейс до тех пор, пока не вернется вызов Ajax, а затем вы сможете что-то сделать.

Например, вы можете отправить запрос Ajax в синхронном режиме c режим, и он будет блокироваться во время ожидания

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