За последние 24 часа нас посетили 22996 программистов и 1706 роботов. Сейчас ищут 1787 программистов ...

Асинхронность в JS для электрочайников

Тема в разделе "JavaScript и AJAX", создана пользователем glorsh66, 10 июн 2018.

  1. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Насколько я понял что JS в своей сути однопоточная.
    Но есть такое понятие как event-loop и queue

    т.е. выполняя основной код - если встречается promise или async функция
    то она кладется в очередь и продолжается выполнение основного блока кода.
    Когда оно завершается, event-loop достает из очереди ожидающую функцию и начинает её выполнение в главном стеке (runtime) и когда все выполнено вызывает callback функцию (или then) обратно в главный стек.

    Т.е. логически получается мы можем как бы просто притормозить выполнение какой либо функции, что бы не было блокирования.

    Но почему тогда можно например на некоторых сайтах одновременно грузить несколько файлов?
    Ведь получается второй потом все равно будет висеть в очереди?
    Или как то все хитрее устроенно?
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    И как люди когда то жили с одноядерными процессорами. Поставил файл на закачаку и все мышка не реагирует клавиши не работает картинка виснет все в очереди
     
    glorsh66 нравится это.
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    отдельных потоков может быть много
    в пхп тоже
    --- Добавлено ---
    пхп и js считаются "однопоточными" не потому, что они однопоточные, а потому, что нет нормальных средств взаимодействия между потоками. Т.е. ты можешь пускать хоть мульён потоков параллельно, но координировать их работу будет сложно и проще писать однопоточный код. Который, тем не менее, сможет обрабатывать разные запросы разными потоками.
     
    glorsh66 нравится это.
  4. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Т.е. я правильно понимаю что если сделать в JS четыре штуки promise - то они будут работать одновременно (как они будут работать одновременно зависит от реализации движка браузера, окружения), но МЫ никак не можем на это повлиять и по этому называется асинхронными запросами (функциями) а не многопоточными.
    Потому что мы потоками никак не можем управлять?
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    они отработают внутри одного потока, если запущены в одном потоке =)

    события не требуют многпоточности. работает это всё в одном потоке, но в ответ на события. Завершился запрос - промис схлопнулся. Другой завершился - другой схлопнулся.

    вот например можно почитать, как организована вытесняющая многозадачность, которая например используется в операционных системах https://habr.com/post/124794/
    --- Добавлено ---
    туда же https://developer.mozilla.org/ru/docs/Web/JavaScript/EventLoop
    --- Добавлено ---
    может это ещё https://medium.com/devschacht/event-loop-timers-and-nexttick-18579cd122e0
     
  6. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Это я понял)
    Но ведь - допустим идет закачка файла - это же процесс который может занимать много времени..

    Событие например - это конец закачки файла.
    Но сам процесс закачки должен где то исполняться?
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    обвязка, которая не затрагивает js
     
    glorsh66 нравится это.
  8. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    И одновременно обвязок получается сколько угодно может быть запущенно?
    Т.е. обвязка - это некий функционал - ну как некая дальняя аналогия - API?
     
  9. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    например, это может выполняться в отдельном потоке браузера. мы из JS не можем получить доступ к нему, не можем им управлять. но когда файл получен, браузер поместит соответствующее событие в callback-очередь. Event loop начнет его выполнять и вот тут JS начнет обработку полученного файла.
    и да, таких вызовов мы можем сделать сколько угодно. например собрать целый массив УРЛов изображений, создать из него массив промисов в связках с функцией скачивания, и отдать в Promise.all(arrayOfPromises)
    и грубо говоря, все урлы будут обрабатываться одновременно(многопоточно, насколько это может браузер.) а когда скачаются все, будет вызван наш код обработки на JS. который продолжит обработку, в своём одном потоке.
     
    glorsh66 нравится это.