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)

freeneutron 07.11.2015 13:19

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

loljs 07.11.2015 13:29

new Promise(function(resolve, reject){setTimeout(function(){a = 1; resolve(null)})})
 .then(function(){console.log(a)})

freeneutron 07.11.2015 13:32

Цитата:

Сообщение от loljs (Сообщение 394945)
new Promise(function(resolve, reject){setTimeout(function(){a = 1; resolve(null)})})
 .then(function(){console.log(a)})

Нельзя нарушать весь код. Надо вставить вместо точек некоторый код, не обращающийся к переменной (a).

loljs 07.11.2015 13:36

Цитата:

Сообщение от freeneutron
Нельзя нарушать весь код. Надо вставить вместо точек некоторый код, не обращающийся к переменной (a)

Вы какую-то ахинею несете. У Вас на момент вызова console.log переменная a == 0

loljs 07.11.2015 13:38

И при чем тут, кстати, io/node?

freeneutron 07.11.2015 13:39

Цитата:

Сообщение от loljs (Сообщение 394947)
Вы какую-то ахинею несете. У Вас на момент вызова console.log переменная a == undefined

Это не херня, а задача. И до момента вызова console.log можно что-нибудь вставить

loljs 07.11.2015 13:41

Цитата:

Сообщение от freeneutron
Это не херня, а задача.

Не думаю. Это херня, какой свет не видывал, идушая от тотальной безграмотности.

freeneutron 07.11.2015 13:44

Цитата:

Сообщение от loljs (Сообщение 394950)
Не думаю. Это херня, какой свет не видывал, идушая от тотальной безграмотности.

Если бы у вас было решение, то вы так не говорили бы

loljs 07.11.2015 13:46

Цитата:

Сообщение от freeneutron
Если бы у вас было решение, то вы так не говорили бы

С этим не поспоришь, LOL. Если бы я в дурдоме был, я бы много чего не говорил. При этом говорил бы много чего другого.

freeneutron 07.11.2015 13:50

Цитата:

Сообщение от loljs (Сообщение 394952)
С этим не поспоришь, LOL. Если бы я в дурдоме был, я бы много чего не говорил. При этом говорил бы много чего другого.

Почему бы вам не поискать решение вместо того, что бы флудить тут и мешать другим участникам форума? Проявляйте уважение к другим.

loljs 07.11.2015 13:52

Почему бы вам не начать изучать JS, вместо того чтобы засирать форум тупняком, и при этом еще дерзить?

freeneutron 07.11.2015 13:56

Цитата:

Сообщение от loljs (Сообщение 394955)
Почему бы вам не начать изучать JS, вместо того чтобы засирать форум тупняком, и при этом еще дерзить?

Данный форум для того и создан, что бы обсуждать вопросы касающиеся JS. Вы же просо флудите (высказываетесь не по теме). И это раздражает.

loljs 07.11.2015 13:59

Цитата:

Сообщение от freeneutron
высказываетесь не по теме

Где я высказался не по теме?
Цитата:

Сообщение от freeneutron
что бы обсуждать вопросы касающиеся JS

Совершенно верно, касающиеся JS, а не того, что думают о нем те, кто понятия не имеют, что это вообще такое.

freeneutron 07.11.2015 14:02

Цитата:

Сообщение от loljs (Сообщение 394959)
Где я высказался не по теме?

Забейте. Я не собираюсь тут мериться с вами половыми органами. И жду ответа на первый пост.

loljs 07.11.2015 16:42

Цитата:

Сообщение от freeneutron
И жду ответа на первый пост.

Как только рак на горе свистнет, Вы его дождетесь.

loljs 07.11.2015 16:45

freeneutron,
Кстати, раз уж Вы такой чародей, может Вы и мне поможете с одним вопросом, который меня сильно волнует. Я собрался идти в казино сегодня. Вот, мне желательно узнать, проиграю я, или выиграю. Если я проиграю, я вообще сегодня не пойду туда. Не поможете?

nick1m 09.11.2015 12:04

// вставьте
console.log(1) // console.log будет выводить 1 и не будет обращаться к переменной, условия задачи не нарушены. :)

nerv_ 09.11.2015 12:58

Цитата:

Сообщение от nick1m
console.log(1) // console.log будет выводить 1 и не будет обращаться к переменной, условия задачи не нарушены.

я хотел ему предложить вставить
alert(1);

конечно, он бы не помог, но вписался лаконично в уже существующее безобразие :)

nick1m 09.11.2015 13:40

А вот подскажите плз, что действительно не могу понять.

Допустим мы вставим:
while(process.uptime()<2)

Т.е. пока процесс не проработал 2 секунды, то цикл будет выдавать
console.log('a')
равное 0, значение его не изменится. Т.е. получается, что таймер не запустится (точнее колбэки) покуда интерпретатор не отработает последнюю строку линейного кода?
setInterval понятно, он отработает как надо.

pnpquest 09.11.2015 15:29

Цитата:

Сообщение от nick1m
что таймер не запустится (точнее колбэки) покуда интерпретатор не отработает последнюю строку линейного кода?

Да
Цитата:

Сообщение от nick1m
он отработает как надо.

Что значит как надо? Он также отработает.

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)

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

Яростный Меч 23.11.2015 17:23

Цитата:

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

спасибо, Кэп

Цитата:

Сообщение от pnpquest (Сообщение 397243)
Только написан через жопу.

но задачу решает. По условию, код можно добавлять только на месте многоточия.

Цитата:

Сообщение от pnpquest (Сообщение 397243)
Про какие стрелочные функции

кури матчасть

Цитата:

Сообщение от pnpquest (Сообщение 397243)
новые тики

ну вот, например, в Windows-приложениях можно самостоятельно крутить очередь сообщений. Я задавался вопросом, можно ли так в Node

nick1m 23.11.2015 21:08

Цитата:

Сообщение от Яростный Меч (Сообщение 397351)
кури матчасть

:stop: он же тебе это наглядно показал!

PS: Не сочти за хамство, парень реально старается вникнуть в вопрос и помогает по мере возможности, но у тебя было совсем "не туда". Т.е. я, как новичок, все эти варианты отработал, кроме как "стрелочных функций", да ещё и не учитывал, что они кушают "\n", но если бы не ты, то не обратил бы на данный момент внимания :).

nick1m 23.11.2015 22:19

Цитата:

Сообщение от Яростный Меч (Сообщение 397351)
спасибо, Кэп

но задачу решает. По условию, код можно добавлять только на месте многоточия.

кури матчасть

ну вот, например, в Windows-приложениях можно самостоятельно крутить очередь сообщений. Я задавался вопросом, можно ли так в Node

Цитата:

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

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

БлиН, рэбяты, а за что минусуете парню, ведь по сути правильно сказал, может и в грубой форме, но оно того заслуживает!!! Зачем абстракциями вуалировать простые вещи? Жрать не на что?


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