@JSlang

Страница 2194 из 2237
Пидорас
09.10.2018
11:33:47
https://habr.com/company/ruvds/blog/340508/ тут в картинках вроде доходчиво
Спасибо за ссылку, это очень дружелюбно. Статью уже читал. Хочу обсудить некоторые моменты, ответ на которые до сих пор не могу найти. Ну то есть спрашиваю себя, а ответить однозначно не могу

Pavel
09.10.2018
11:34:16
Ну вы вопрос пишите тут, кто-то да может и ответит =)

Пидорас
09.10.2018
11:49:32
Ну первый вопрос о том, поочередно ли выполняются задачи из цикла событий?

Google
Пидорас
09.10.2018
11:51:11
А кто занимается вызовом коллбэков, когда вызываются события? Это цикл событий помнит при каком событии, какие коллбэки нужно выполнить?

Ну первый вопрос о том, поочередно ли выполняются задачи из цикла событий?
И если задачи выполняются поочередно, значит ли это то, что их исполнение, является блокирующим? Конечно, это полезные действия, а действия вроде ожидания ответа от БД следует выполнять асинхронно, пополняя цикл событий, но я имею в виду вот что: Если NodeJS, например, (без модуля cluster) однопоточная, то в то время, когда выполняется функция из цикла событий, JS не может предпринять никаких действий для того, что бы в это время начать выполнять что-то ещё? Он ждет пока функция выполнится до конца, а после этого начинает выполнять следующую функцию в очереди.

Если всё так, то как обеспечивается операции I/O? Например я пишу сервер на NodeJS. Прошу JS слушать порт 80 и обрабатывать данные. И вот приходит первый запрос. Каждый запрос я обрабатываю так: событие запроса.(Парсинг запроса.(вызов к БД.(вывод результата))) То есть при первом запросе очередь цикла событий пуста. Шаг 1. Случается событие запроса и очередь пополняется первым коллбэком (Парсинг запроса). На сколько я понимаю, дальше event loop (el в будущем) проверяет есть ли что-нибудь в очереди и если есть - выполняет, а выполняет он в данном случае тот самый коллбэк "Парсинг запроса". Шаг 2. Во время выполнения первого коллбэка, очередь пополняется вторым коллбэком (вызов к БД), а перед исполнением конечно из очереди убирается выполняемое событие. Шаг 3. JS проверяет очередь и приступает к исполнению второго коллбэка. В его теле делается асинхронный запрос к БД. При получении ответа - должен быть вызван третий коллбэк "вывод результата". Значит имя события и коллбэк добавляются в очередь. Тут у меня возникает вопрос. Кто отвечает за вызов события о получении данных из БД? И что, если во время любого из этих шагов появится новый запрос?

Максим
09.10.2018
12:33:39
Всем привет подскажите как мне впихнуть url во фрейм. <frameset rows="100%"> <frame src="" frameborder="0" noresize="noresize"> </frameset>

Viktor
09.10.2018
12:41:04
Если всё так, то как обеспечивается операции I/O? Например я пишу сервер на NodeJS. Прошу JS слушать порт 80 и обрабатывать данные. И вот приходит первый запрос. Каждый запрос я обрабатываю так: событие запроса.(Парсинг запроса.(вызов к БД.(вывод результата))) То есть при первом запросе очередь цикла событий пуста. Шаг 1. Случается событие запроса и очередь пополняется первым коллбэком (Парсинг запроса). На сколько я понимаю, дальше event loop (el в будущем) проверяет есть ли что-нибудь в очереди и если есть - выполняет, а выполняет он в данном случае тот самый коллбэк "Парсинг запроса". Шаг 2. Во время выполнения первого коллбэка, очередь пополняется вторым коллбэком (вызов к БД), а перед исполнением конечно из очереди убирается выполняемое событие. Шаг 3. JS проверяет очередь и приступает к исполнению второго коллбэка. В его теле делается асинхронный запрос к БД. При получении ответа - должен быть вызван третий коллбэк "вывод результата". Значит имя события и коллбэк добавляются в очередь. Тут у меня возникает вопрос. Кто отвечает за вызов события о получении данных из БД? И что, если во время любого из этих шагов появится новый запрос?
Event Loop в NodeJS ничего не выполняет сам по себе, насколько мне известно

Он делегирует эту работу другим подсистемам (файловой, БД, сетевой и т.д.). Когда работа заканчивается, источник вызывает этот самый callback с результатом. Event Loop это видит и передает результат интерпретатору Javascript.

Nikolay
09.10.2018
12:56:43
Если всё так, то как обеспечивается операции I/O? Например я пишу сервер на NodeJS. Прошу JS слушать порт 80 и обрабатывать данные. И вот приходит первый запрос. Каждый запрос я обрабатываю так: событие запроса.(Парсинг запроса.(вызов к БД.(вывод результата))) То есть при первом запросе очередь цикла событий пуста. Шаг 1. Случается событие запроса и очередь пополняется первым коллбэком (Парсинг запроса). На сколько я понимаю, дальше event loop (el в будущем) проверяет есть ли что-нибудь в очереди и если есть - выполняет, а выполняет он в данном случае тот самый коллбэк "Парсинг запроса". Шаг 2. Во время выполнения первого коллбэка, очередь пополняется вторым коллбэком (вызов к БД), а перед исполнением конечно из очереди убирается выполняемое событие. Шаг 3. JS проверяет очередь и приступает к исполнению второго коллбэка. В его теле делается асинхронный запрос к БД. При получении ответа - должен быть вызван третий коллбэк "вывод результата". Значит имя события и коллбэк добавляются в очередь. Тут у меня возникает вопрос. Кто отвечает за вызов события о получении данных из БД? И что, если во время любого из этих шагов появится новый запрос?
http://latentflip.com/loupe/?code=JC5vbignYnV0dG9uJywgJ2NsaWNrJywgZnVuY3Rpb24gb25DbGljaygpIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gdGltZXIoKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1lvdSBjbGlja2VkIHRoZSBidXR0b24hJyk7ICAgIAogICAgfSwgMjAwMCk7Cn0pOwoKY29uc29sZS5sb2coIkhpISIpOwoKc2V0VGltZW91dChmdW5jdGlvbiB0aW1lb3V0KCkgewogICAgY29uc29sZS5sb2coIkNsaWNrIHRoZSBidXR0b24hIik7Cn0sIDUwMDApOwoKY29uc29sZS5sb2coIldlbGNvbWUgdG8gbG91cGUuIik7!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D

Viktor
09.10.2018
13:03:02




по поводу конкретно вопроса "Кто отвечает за вызов события о получении данных из БД?", я не знаю. Скорее всего сама БД уведомляет, а там уже nodejs-адаптер (с низкоуровневыми биндингами) принимает



Пидорас
09.10.2018
13:11:55
Он делегирует эту работу другим подсистемам (файловой, БД, сетевой и т.д.). Когда работа заканчивается, источник вызывает этот самый callback с результатом. Event Loop это видит и передает результат интерпретатору Javascript.
Тут ведь речь о адапторе? Ну то есть event loop хранит в своём представлении js callback, а при вызове драйвера БД, говорит куда обратиться, когда запрос будет выполнен и в момент обращения пополняет очередь вызовов js коллбэком из памяти и при его вызове передает данные?

Viktor
09.10.2018
13:12:54
да!

Google
Viktor
09.10.2018
13:13:13
мне этого представления хватило на долгие годы) дальше я пока не лез

этот цикл событий - легковесная штука в плане задач сам интерпретатор JS на тяжелых задачах тупит, поэтому даже шифрование типа bcrypt делегируется C/C++



то есть JS-интерпретатор - это скоросшиватель цикл событий - секретарь всю тяжелую работу делает "аутсорс"

Благодаря этому разделению и неблокирующей архитектуре цикла событий, мы имеем хорошую производительность

Viktor
09.10.2018
13:24:07
да, точно, спасибо за замечание

Пидорас
09.10.2018
13:29:46
Кстати, вот на схеме опрос I/O, сейчас пойду читать и есть после этого, а потом вернусь. Но перед этим вопрос - это действие и есть получение информации о статусе? Статусе чтения файла, запроса к БД, рендера картинки, вычисления психологического размера члена и т.д. https://habrastorage.org/getpro/habr/post_images/752/be5/35f/752be535f3ef3f5e0e531e77fc67757a.png

Nikita
09.10.2018
13:32:20
Народ, привет всем! Как реализовать отлов события ajaxSuccess без использования jQuery?

Nikita
09.10.2018
13:33:41
Возможно addEventListener
Но на какое событие?

не обнаружил

Пидорас
09.10.2018
13:34:23
Но на какое событие?
"ajaxSuccess" target.addEventListener('ajaxSuccess', callback)

Nikita
09.10.2018
13:36:10
"ajaxSuccess" target.addEventListener('ajaxSuccess', callback)
Чет мне подсказывает, что в JS такого нету

Пидорас
09.10.2018
13:37:02
Чет мне подсказывает, что в JS такого нету
target нужно заменить на элемент, на котором должно возникнуть это событие

Nikita
09.10.2018
13:37:28
target нужно заменить на элемент, на котором должно возникнуть это событие
Я в принципе про event. Его не существует: https://developer.mozilla.org/en-US/docs/Web/Events

Maksim
09.10.2018
13:37:42
Nikita
09.10.2018
13:37:52
Ну вот

Я о чем

Google
Maksim
09.10.2018
13:38:09
Nikita
09.10.2018
13:38:56
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/onreadystatechange
да, эт клево, знаю, но мне нужно не на мои события

Maksim
09.10.2018
13:39:16
что значит не на мои события?

Viktor
09.10.2018
13:39:50
Другой человек говорит что по его мнению, это Event Loop опрашивает драйвера устройств в каждой итерации
глубоко технически я не знаю) к сожалению передо мной не стояло такой задачи, да и я скорее всего забыл бы, если бы прочитал когда-то

поэтому я абстрагировался от конкретики

что значит не на мои события?
мне вот тоже интересно

Nikita
09.10.2018
13:40:41
что значит не на мои события?
Я имею в виду, что у меня нет элемента, на котором будет что-то происходить. Нужно ловить все AJAX'ы в document. Как если бы было document.ajaxSuccess(...)

Если другой скрипт что-то куда-то запрашивает - я должен об этом знать

Nikita
09.10.2018
13:42:26
имеется в виду перехватить что возвращает из аякс запросов чужой код?
Не обязательно даже перехватывать. Просто должен знать, что, например, был вызван GET cart.js успешно

Maksim
09.10.2018
13:42:51
Viktor
09.10.2018
13:42:54
аааа

Viktor
09.10.2018
13:42:59
думаю, никак

Nikita
09.10.2018
13:43:05
Ну Жквери как-то это ж делает

Viktor
09.10.2018
13:43:16
не уверен

Maksim
09.10.2018
13:43:19
Nikita
09.10.2018
13:43:35
$itg(document).ajaxSuccess(function(a, b, c) { if (c.url.indexOf('/cart/add.js') !== -1 || c.url.indexOf('/cart/change.js') !== -1 || c.url === '/cart.js' || c.url === '/cart/update.js') { itg_fsb_check_cart() } })

Viktor
09.10.2018
13:43:56
jQuery - просто обертка над XMLHttpRequest

хм

Maksim
09.10.2018
13:44:44
$itg(document).ajaxSuccess(function(a, b, c) { if (c.url.indexOf('/cart/add.js') !== -1 || c.url.indexOf('/cart/change.js') !== -1 || c.url === '/cart.js' || c.url === '/cart/update.js') { itg_fsb_check_cart() } })
если ты вызовешь аякс запрос нативно, а не через jq то этот код его не перехватит

Google
Nikita
09.10.2018
13:45:02
О как

Я понял, спасибо

Выходит он ловит только те события, которые сам и создает

Тогда все логично

Maksim
09.10.2018
13:45:41
конечно, он их сам создает и сам ловит, просто в другом месте

Viktor
09.10.2018
13:46:24


ну в принципе тут "трава подстелена" для того, чтобы удобно вешать дополнительные слушатели на предмет сетевото ответа важно понимать, что тут вызов зарегистрирован глобально

это скорее особый случай

Admin
ERROR: S client not available

Viktor
09.10.2018
13:49:05
если сама процедура запроса запрятана где-то в коде (не привязана ни к чему, неглобальна), то к ней никак не получишь

коротко говоря вопрос в следующем

Maksim
09.10.2018
13:49:28
jq просто эталон говеного кода

Viktor
09.10.2018
13:49:28
"есть ли у тебя доступ к контексту вызова, или нет"

jq просто эталон говеного кода
да, по сути проблема чисто архитектурная

слушай

Nikita
09.10.2018
13:53:02
конечно, он их сам создает и сам ловит, просто в другом месте
Я к чему это спрашиваю вообще. Есть магазины и у них есть темки. В зависимости от темы в корзину товар добавляется либо аяксом, либо запросом по клику на кнопку (кнопкой может быть все ( input, span, button)). И вот мне нужно ловить события добавления в корзину

Повесить хэндлеры на все элементы - это изврат

Viktor
09.10.2018
13:53:52
а что происходит после основного запроса (из чужого скрипта)

Viktor
09.10.2018
13:54:02
он должен оставлять "следы"

Google
Maksim
09.10.2018
13:54:09
не надо такой софт использовать )

Viktor
09.10.2018
13:54:49
то есть может тебе отследить не сам запрос, а факт его выполнения (например, html обновился как-то)

не надо такой софт использовать )
ну что поделать) у человека сейчас нет другого выбора

я помню как сам шастал по форумам, и мне говорили "тебе надо все переписывать"

Nikita
09.10.2018
13:56:43
как вообще может быть связана тема и способ добавления товара в корзину?
Shopify. Там темы довольно масштабный кусок магазина

В этом и беда, я не знаю когда и откуда что вызовется, и поэтому должен ловить все

Nikita
09.10.2018
14:00:22
Огонь, это мысль. Спасибо

Nikolay
09.10.2018
14:00:57
XMLHttpRequest.prototype.realSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function (value) { this.addEventListener('progress', () => { console.log("Loading"); }, false); this.realSend(value); };

Это ж жс, воруй-убивай.

Viktor
09.10.2018
14:01:44
Duego
09.10.2018
14:01:54
как создать массив от 1 до n ?

Nikolay
09.10.2018
14:02:38
Viktor
09.10.2018
14:03:07
https://github.com/jpillora/xhook гугл всему голова ёпты
Спасибо большое за наводку. Возьму на заметку на всякий случай

Nikolay
09.10.2018
14:03:14
А что значит от 1? О_о

Не пиши ничего в head и всё.

Viktor
09.10.2018
14:03:29
ему нужен range походу

Yura
09.10.2018
14:03:39
как создать массив от 1 до n ?
Array(n).fill('').map((e, i) => i)

Страница 2194 из 2237