время которых исполняется пользовательский код: timers phase и poll phase. Timers исполняет всякие таймеры, а poll i/o. Но что насчёт остальных асинхронных запросов, например, запросы по сети? Или коллбек от дочерних процессов? Или коллбек от событий? Когда они обрабатываются
Коллбек от событий это что?
Сеть, это те же сокеты, тот же poll
Что такое коллбек от дочерних процессов в этом контексте
Например, стримы, когда кидают событие data— доступен новый кусок данных для чтения
Например, exec(‘command’, callback);
стримы - это те же event emitter, а коллбеки в них вызываются синхронно
Ок, ну остальные коллбеки, которые срабатывают асинхронно Дочерние процессы, сеть, коллбеки событий браузера типа onClick
а при чем события браузера в ноде?))
Ну типа event loop и в node, и в браузере примерно одинаковый, нет? И там, и там v8
здесь я не уверен, но это тот же async i/o, на винде это просто вызов какой то WaitForObject, надо смотреть доки/сорсы ноды/libuv
dom api насколько знаю - синхронный, но я не эксперт, может поправять кто то здесь
Где-то вообще можно найти исчерпывающую информацию по event loop, кроме исходников libuv? На mdn и nodejs очень поверхностно, ещё читал на ibm developer, но там тоже нет деталей особо
а какая цель всего этого? постичь дзен евент лупа и распределять так задачи в реальности?
Понимать, что в каком порядке, как и именно и почему исполняется
статью не дам, не знаю такую, а какой толк от этих знаний будет?)) думаете что сразу высокоэффективный код будете писать?
Тут дело не в эффективности, а понимании того, как работает код Я как-то спорил с человеком насчёт такого кода: const items = queue; queue.length = 0; processItems(items); Суть спора — может ли что-то асинхронно прилететь между первой и второй строкой, что приведёт к потере данных. Я считаю, что нет, но доказать почему не смог
нет, и глубокое понимание каждой фазы эвент лупа здесь не нужно
в этом и фишка, что доказывание кому-то чего-то и стремление к знанию эт разные вещи)
Реализуй свой цикл
Звучит прикольно, я бы попробовал. А что именно исполнять? Я же не хочу учиться интерпретировать js с нуля
И там и там v8, но libuv только в ноде
запросы по сети обрабатываются наряду с i/o но i/o ранится на threads в то время как ОС сама разбирается с запросами по сети пните если неправильно
Хм. А почему так сложилось? Ведь и там, и там есть event loop.
Язык никак не связан с событийным циклом. Напиши на js свой собственный цикл через yield
Потому что браузер это не единое приложение, js, цикл событий, парсер css, парсер html, рендер html, рендер шрифтов - это всё независимые реализации, а браузер только склеивает всё воедино
Честно говоря, пока не очень представляю, как концептуально это должно выглядеть :С Что же будет исполняться / происходить в моем цикле, если не исполнение кода ?
while (true) { if (tasks.lenght) { // Выполняем нужны код } }
А, ну попробую. То есть симулировать эти очереди таймеров, очередь микротасок, очередь immediate, очередь событий close и попробовать сделать их обработку руками, приняв сами таски за объекты пустышки, т.к. это не важно А причём тут yield?
yield поможет реализовать async await, на колбеках писать это ад
Так стоп, то есть ты предлагаешь все таки брать и исполнять реальный js код, а не какие-то абстрактные объекты из массива tasks в примере выше?
Да, просто не используй все асинхронные абстракции: promise, async, settimeout
Жесть, ну вот я взял строку с js кодом Сначала надо разобрать на ast Потом... разбить на statements/expressions, я даже не знаю, как это делается, и потом как-то это исполнять, и только на этапе исполнения всплывает event loop? Или я не совсем так понял? Это ведь нужно реализовать все конструкции языка, встроенные объекты, и так далее
И все же, Sergey, как можно написать event loop для исполнения реального кода не реализовав весь процесс интерпретации js?
Не нужно тебе парсить js, ты событийный цикл пишешь, а не интегратор js. Пиши на обычном js и исполняй в ноде
Почитай что такое yield и за как работают астериск-функции)
Ну, например, Promise я могу переопределить, чтобы использовать свою кастомную логику. setTimeout тоже могу заменить на свою функцию. Но async-await же операторы, тут я не могу сделать кастомную обработку
У меня проблема не в понимании генераторов, а как написать свой ивент луп
вопрос - зачем?)
В образовательных целях
Тебе не нужно заменять, просто напиши свою реализацию в виде функции и не используй встроенных вещей
Вот пример: fs.readFile(‘path’).then(async contents => await fetch(...)); Цель была исполнить этот код со своим ивент лупом. Каким образом я могу это сделать не переопределив .then, .readFile и fetch?
че за мясо
Обсуждение идёт вообще не про качество кода в этом фрагменте Речь про обработку разных кейсов асинхронных запросов в своей реализации event loop
дай угадаю, ты безработный
А чего ты так решил?
если человек пишет then с async - он троль
Почему?
нуу, спорный момент на самом деле
рекомендую сменить стратегию обучения) вместо запила можно изучить как он работает используя документацию и примеры
Да я-то изучил. Доки libuv ещё не читал, правда. Сама идея реализации своего loop показалась интересной
да, интересных идей много) но кроме интереса стоит и другие факторы оценивать. нет ли чего-то более важного для изучения, нельзя ли без реализации получить понимание работы event loop. понятно, что если времени много можно даже свой комп собрать с нуля
уже видел как челик запустил DOOM на картошке ?)
Может немного поможет habr.com/ru/post/336498/
Это нормальная практика если для результата нужна обработка и не хочется засорять область видимости переменными, которые не пригодятся
лол
ну если время, деньги есть можно их конвертировать в высокий уровень удивительности происходящего) это же очевидно)
Обсуждают сегодня