Насколько я понял что JS в своей сути однопоточная. Но есть такое понятие как event-loop и queue т.е. выполняя основной код - если встречается promise или async функция то она кладется в очередь и продолжается выполнение основного блока кода. Когда оно завершается, event-loop достает из очереди ожидающую функцию и начинает её выполнение в главном стеке (runtime) и когда все выполнено вызывает callback функцию (или then) обратно в главный стек. Т.е. логически получается мы можем как бы просто притормозить выполнение какой либо функции, что бы не было блокирования. Но почему тогда можно например на некоторых сайтах одновременно грузить несколько файлов? Ведь получается второй потом все равно будет висеть в очереди? Или как то все хитрее устроенно?
И как люди когда то жили с одноядерными процессорами. Поставил файл на закачаку и все мышка не реагирует клавиши не работает картинка виснет все в очереди
отдельных потоков может быть много в пхп тоже --- Добавлено --- пхп и js считаются "однопоточными" не потому, что они однопоточные, а потому, что нет нормальных средств взаимодействия между потоками. Т.е. ты можешь пускать хоть мульён потоков параллельно, но координировать их работу будет сложно и проще писать однопоточный код. Который, тем не менее, сможет обрабатывать разные запросы разными потоками.
Т.е. я правильно понимаю что если сделать в JS четыре штуки promise - то они будут работать одновременно (как они будут работать одновременно зависит от реализации движка браузера, окружения), но МЫ никак не можем на это повлиять и по этому называется асинхронными запросами (функциями) а не многопоточными. Потому что мы потоками никак не можем управлять?
они отработают внутри одного потока, если запущены в одном потоке =) события не требуют многпоточности. работает это всё в одном потоке, но в ответ на события. Завершился запрос - промис схлопнулся. Другой завершился - другой схлопнулся. вот например можно почитать, как организована вытесняющая многозадачность, которая например используется в операционных системах https://habr.com/post/124794/ --- Добавлено --- туда же https://developer.mozilla.org/ru/docs/Web/JavaScript/EventLoop --- Добавлено --- может это ещё https://medium.com/devschacht/event-loop-timers-and-nexttick-18579cd122e0
Это я понял) Но ведь - допустим идет закачка файла - это же процесс который может занимать много времени.. Событие например - это конец закачки файла. Но сам процесс закачки должен где то исполняться?
И одновременно обвязок получается сколько угодно может быть запущенно? Т.е. обвязка - это некий функционал - ну как некая дальняя аналогия - API?
например, это может выполняться в отдельном потоке браузера. мы из JS не можем получить доступ к нему, не можем им управлять. но когда файл получен, браузер поместит соответствующее событие в callback-очередь. Event loop начнет его выполнять и вот тут JS начнет обработку полученного файла. и да, таких вызовов мы можем сделать сколько угодно. например собрать целый массив УРЛов изображений, создать из него массив промисов в связках с функцией скачивания, и отдать в Promise.all(arrayOfPromises) и грубо говоря, все урлы будут обрабатываться одновременно(многопоточно, насколько это может браузер.) а когда скачаются все, будет вызван наш код обработки на JS. который продолжит обработку, в своём одном потоке.