2 / 2 / 0
Регистрация: 02.09.2014
Сообщений: 81
|
||||||
1 | ||||||
Понимание асинхронности11.02.2018, 22:32. Показов 580. Ответов 5
Метки нет (Все метки)
Почему если я вызову функцию:
Я так понимаю,что операции работы с сетью выполняются в другом потоке,и при исполнении операции callback перемещаются в очередь,которую обрабатывает event loop...и дальше уже в stack.А функции ,созданные в коде выполняются в главном потоке...
0
|
11.02.2018, 22:32 | |
Ответы с готовыми решениями:
5
Сложная задача по асинхронности в javascript Понимание DOM Понимание кода Понимание JavaScript |
707 / 309 / 191
Регистрация: 05.03.2015
Сообщений: 822
|
|
11.02.2018, 22:55 | 2 |
Браузер виснет потому-что ждет завершения цикла перед вызовом
callback() пока вы не сделаете запрос синхронным, весь код, стоящий после ajax запроса, не будет ждать выполнения запроса. ajax запросы выполняются в том же потоке. Все, что такие запросы делают - отправляют запрос серверу, ждут пока тот ответит и в случае необходимости выполняют свои колбеки. проще всего думать что ajax запрос - то же самое, что setTimeout с неопределенной задержкой. В вашем примере создается большая нагрузка на браузер, вот он и подвисает. Здесь нет ничего похожего на ajax запросы, код выполняется синхронно. Если вы заключите цикл в SetTimeout с нулевой задержкой, колбек сработает (хотя это не решит проблему зависания) - это будет асинхронное выполнение цикла
1
|
2 / 2 / 0
Регистрация: 02.09.2014
Сообщений: 81
|
|
11.02.2018, 23:08 [ТС] | 3 |
Хорошо.А как же NodeJS...движок V8.Там тоже операции IO выполняются в одном потоке?
0
|
707 / 309 / 191
Регистрация: 05.03.2015
Сообщений: 822
|
|
11.02.2018, 23:20 | 4 |
В NodeJS есть такое понятие как
pipe() - это и есть потоки. Но скорее всего ваш код подвесит ноду так же, как выполнение в браузере. В реальной жизни вам вряд ли прийдется заниматься таким непротребством)
0
|
2 / 2 / 0
Регистрация: 02.09.2014
Сообщений: 81
|
|
11.02.2018, 23:30 [ТС] | 5 |
Понятно.Те есть асинхронный код это прежде всего как средство использовать один поток с максимальной выгодой,позволяя
использовать процессорное время,когда какая-то операция простаивает и ждет результата. Подходит идеально для операции не требующих много процессорных ресурсов.В случае NodeJS часть данных операции можно возложить на потоки другие ,ожидая от них callback в основном потоке.Все верно?
0
|
707 / 309 / 191
Регистрация: 05.03.2015
Сообщений: 822
|
|
12.02.2018, 00:08 | 6 |
Не совсем так. Асинхронныйы код не блокирует выполнение следующего за ним кода, это не совсем то же самое, что и поток в привычном понимании - JS (браузерный) сам по себе однопоточный, как я и писал ранее. В случае необходимости выполнения такого тяжелого кода, можно либо разобрать код на несколько итераций, каждая из которых будет не будет вешать намертво поток, либо вынести выполнение кода в service worker, либо производить тяжелые вычисления на стороне сервера.
на самом деле я не сталкивался с необходимостью сильно нагружать выполнение node скрипта, потому сказать наверняка по этому поводу не могу. Полагаю, логика будет практически такая же, как на клиенте
0
|
12.02.2018, 00:08 | |
12.02.2018, 00:08 | |
Помогаю со студенческими работами здесь
6
Понимание синтаксиса Понимание области видимости и смежных понятий Добиться асинхронности запроса Ошибка асинхронности (await SaveChangesAsync) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |