Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   ожидание завершения коллбэков (https://javascript.ru/forum/node-js-io-js/59350-ozhidanie-zaversheniya-kollbehkov.html)

nick1m 09.11.2015 22:54

Цитата:

Сообщение от pnpquest (Сообщение 395323)
Да

Спасибо, понятно. Я просто думал до этого, что задание отправляется на выполнение сразу же, а вывод результата в зависимости от времени исполнения. Ошибался значит, сам пару недель назад начал знакомиться.

Цитата:

Сообщение от pnpquest (Сообщение 395323)
Да
Что значит как надо? Он также отработает.

Значит это, что его колбэк может вывести изменённое значение переменной "а", хотя и не так, как хочет того топикстартер.

Но про то, что Вы имели ввиду, тоже ясно, мой пример Выше это наглядно показывает.

pnpquest 09.11.2015 23:14

Цитата:

Сообщение от nick1m
что задание отправляется на выполнение сразу же, а вывод результата в зависимости от времени исполнения

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

А возвращаясь к тому вопросу, если будет долгий цикл, он просто не даст начать исполняться коллбеку, который назначен на время задержки. Коллбек будет вынужден "ждать", пока цикл отработает.

nick1m 09.11.2015 23:47

Цитата:

Сообщение от pnpquest (Сообщение 395410)
А возвращаясь к тому вопросу, если будет долгий цикл, он просто не даст начать исполняться коллбеку, который назначен на время задержки. Коллбек будет вынужден "ждать", пока цикл отработает.

Спасибо за развёрнутый ответ!

А колбэки, получается друг друга не блокируют? Т.к. вывод колбэка одной и той же функции осуществляется вовсе не в порядке поступления запроса. Так?

PS: Может я наивные вопросы задаю, но у меня пока трудно всё это в голове укладывается. Интуитивно понимаю, даже уже кое-чего написал, работает, для линейности стадий обработки использовал оборачивание в промисы. Но полной ясности представления ещё нет. :)

pnpquest 09.11.2015 23:53

Цитата:

Сообщение от nick1m
А колбэки, получается друг друга не блокируют?

Блокируют. В единственном потоке может исполняться только один коллбек. Они исполняются в порядке очереди, если поток занят.

pnpquest 10.11.2015 00:01

Цитата:

Сообщение от nick1m
вывод колбэка одной и той же функции осуществляется вовсе не в порядке поступления запроса

не в порядке, но это звисит от внешних условий, а не от самого движка. Например от сети, от порядка обработки сервером. Например, экземпляр XMLHttpRequest, асинхронно отсылает запрос, а при получении ответа он запускает коллбек. Если одна функция посылает 2 запроса,, она, как правило создает 2 экземпляра XMLHttpRequest, и каждый экземпляр дожидается своего ответа. Не факт, что 1 ответ придет раньше второго

nick1m 10.11.2015 00:21

Цитата:

Сообщение от pnpquest (Сообщение 395420)
не в порядке..

Понял, спасибо, именно это я и имел ввиду.

Яростный Меч 20.11.2015 02:33

Цитата:

Сообщение от freeneutron (Сообщение 394941)
Помогите решить такую задачу. Надо вместо точек вставить некоторый код, не обращающийся к переменной a и такой, что бы console.log выводил: 1,
a= 0;
setTimeout(function(){a= 1},1000)
. . .
console.log(a)

a= 0;
setTimeout(function(){a= 1},1000)
setTimeout(function(){cb();},1000); var cb = () => 
console.log(a)


работает везде, где имеют место "стрелочные функции" из нового стандарта.

----
Но, возможно, задача была не в этом? здесь по сути мы запустили console.log в другом "тике". Может, надо это сделать в том же "тике", в котором отработали строки 1 и 2? Тогда на 3 строку надо вставить код, который будет не менее секунды прокручивать "цикл очереди сообщений" ноды (подобно тому как модальные окна в винде крутят очередь потока, блокируя вызывающую функцию, но не UI в целом). Можно ли так сделать, судить не берусь.

nick1m 20.11.2015 10:17

Цитата:

Сообщение от Яростный Меч (Сообщение 396829)
a= 0;
setTimeout(function(){a= 1},1000)
setTimeout(function(){cb();},1000); var cb =  () => 
console.log(a)

Прикольное решение!!! :)

"Ловкость рук и никакого мошенничества" (с) :)

На сколько я понимаю, данная запись равносильна:
a= 0;
setTimeout(function(){a= 1},1000)
setTimeout(function(){cb();},1000); var cb =  function() { 
  console.log(a)
}


Но, тем не менее, решает условие задачи в том виде, как оно представлено.

MallSerg 23.11.2015 02:47

Цитата:

Сообщение от freeneutron
Помогите решить такую задачу. Надо вместо точек вставить некоторый код, не обращающийся к переменной a и такой, что бы console.log выводил: 1,
a= 0;
setTimeout(function(){a= 1},1000)
. . .
console.log(a)

Так очевидно же переопределить функцию и пусть она выводит что душе угодно
a= 0;
setTimeout(function(){a= 1},1000)
c=console;console={"log":function(){c.log(5);console=c}};
console.log(a)

pnpquest 23.11.2015 03:38

Яростный Меч,
Твой код эквивалентен
a= 0;
setTimeout(function(){a= 1},1000)
setTimeout(function(){console.log(a)},1000)

Только написан через жопу.
Про какие стрелочные функции и новые тики ты говоришь, хз.


Часовой пояс GMT +3, время: 18:12.