09.11.2015, 22:54
|
Интересующийся
|
|
Регистрация: 31.10.2015
Сообщений: 29
|
|
Сообщение от pnpquest
|
Да
|
Спасибо, понятно. Я просто думал до этого, что задание отправляется на выполнение сразу же, а вывод результата в зависимости от времени исполнения. Ошибался значит, сам пару недель назад начал знакомиться.
Сообщение от pnpquest
|
Да
Что значит как надо? Он также отработает.
|
Значит это, что его колбэк может вывести изменённое значение переменной "а", хотя и не так, как хочет того топикстартер.
Но про то, что Вы имели ввиду, тоже ясно, мой пример Выше это наглядно показывает.
|
|
09.11.2015, 23:14
|
Аспирант
|
|
Регистрация: 09.11.2015
Сообщений: 94
|
|
Сообщение от nick1m
|
что задание отправляется на выполнение сразу же, а вывод результата в зависимости от времени исполнения
|
Да так оно и есть.
Точней, коллбек сеттится на событие таймера.. Когда событие таймера срабатывает, этот коллбек начинает исполняться. Таймер сам его запускает, но только в том случае, если поток не занят. В противном случае, он кидается в очередь на исполнение. Во время своего исполнения, он также как и любой код блокирует единственный поток.
А возвращаясь к тому вопросу, если будет долгий цикл, он просто не даст начать исполняться коллбеку, который назначен на время задержки. Коллбек будет вынужден "ждать", пока цикл отработает.
Последний раз редактировалось pnpquest, 09.11.2015 в 23:37.
|
|
09.11.2015, 23:47
|
Интересующийся
|
|
Регистрация: 31.10.2015
Сообщений: 29
|
|
Сообщение от pnpquest
|
А возвращаясь к тому вопросу, если будет долгий цикл, он просто не даст начать исполняться коллбеку, который назначен на время задержки. Коллбек будет вынужден "ждать", пока цикл отработает.
|
Спасибо за развёрнутый ответ!
А колбэки, получается друг друга не блокируют? Т.к. вывод колбэка одной и той же функции осуществляется вовсе не в порядке поступления запроса. Так?
PS: Может я наивные вопросы задаю, но у меня пока трудно всё это в голове укладывается. Интуитивно понимаю, даже уже кое-чего написал, работает, для линейности стадий обработки использовал оборачивание в промисы. Но полной ясности представления ещё нет.
|
|
09.11.2015, 23:53
|
Аспирант
|
|
Регистрация: 09.11.2015
Сообщений: 94
|
|
Сообщение от nick1m
|
А колбэки, получается друг друга не блокируют?
|
Блокируют. В единственном потоке может исполняться только один коллбек. Они исполняются в порядке очереди, если поток занят.
|
|
10.11.2015, 00:01
|
Аспирант
|
|
Регистрация: 09.11.2015
Сообщений: 94
|
|
Сообщение от nick1m
|
вывод колбэка одной и той же функции осуществляется вовсе не в порядке поступления запроса
|
не в порядке, но это звисит от внешних условий, а не от самого движка. Например от сети, от порядка обработки сервером. Например, экземпляр XMLHttpRequest, асинхронно отсылает запрос, а при получении ответа он запускает коллбек. Если одна функция посылает 2 запроса,, она, как правило создает 2 экземпляра XMLHttpRequest, и каждый экземпляр дожидается своего ответа. Не факт, что 1 ответ придет раньше второго
|
|
10.11.2015, 00:21
|
Интересующийся
|
|
Регистрация: 31.10.2015
Сообщений: 29
|
|
Сообщение от pnpquest
|
не в порядке..
|
Понял, спасибо, именно это я и имел ввиду.
|
|
20.11.2015, 02:33
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
Сообщение от freeneutron
|
Помогите решить такую задачу. Надо вместо точек вставить некоторый код, не обращающийся к переменной 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 в целом). Можно ли так сделать, судить не берусь.
|
|
20.11.2015, 10:17
|
Интересующийся
|
|
Регистрация: 31.10.2015
Сообщений: 29
|
|
Сообщение от Яростный Меч
|
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)
}
Но, тем не менее, решает условие задачи в том виде, как оно представлено.
|
|
23.11.2015, 02:47
|
|
Профессор
|
|
Регистрация: 07.03.2011
Сообщений: 1,138
|
|
Сообщение от 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)
Последний раз редактировалось MallSerg, 23.11.2015 в 03:34.
|
|
23.11.2015, 03:38
|
Аспирант
|
|
Регистрация: 09.11.2015
Сообщений: 94
|
|
Яростный Меч,
Твой код эквивалентен
a= 0;
setTimeout(function(){a= 1},1000)
setTimeout(function(){console.log(a)},1000)
Только написан через жопу.
Про какие стрелочные функции и новые тики ты говоришь, хз.
|
|
|
|