Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 09.11.2015, 22:54
Интересующийся
Отправить личное сообщение для nick1m Посмотреть профиль Найти все сообщения от nick1m
 
Регистрация: 31.10.2015
Сообщений: 29

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

Сообщение от pnpquest Посмотреть сообщение
Да
Что значит как надо? Он также отработает.
Значит это, что его колбэк может вывести изменённое значение переменной "а", хотя и не так, как хочет того топикстартер.

Но про то, что Вы имели ввиду, тоже ясно, мой пример Выше это наглядно показывает.
Ответить с цитированием
  #22 (permalink)  
Старый 09.11.2015, 23:14
Аспирант
Посмотреть профиль Найти все сообщения от pnpquest
 
Регистрация: 09.11.2015
Сообщений: 94

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

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

Последний раз редактировалось pnpquest, 09.11.2015 в 23:37.
Ответить с цитированием
  #23 (permalink)  
Старый 09.11.2015, 23:47
Интересующийся
Отправить личное сообщение для nick1m Посмотреть профиль Найти все сообщения от nick1m
 
Регистрация: 31.10.2015
Сообщений: 29

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

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

PS: Может я наивные вопросы задаю, но у меня пока трудно всё это в голове укладывается. Интуитивно понимаю, даже уже кое-чего написал, работает, для линейности стадий обработки использовал оборачивание в промисы. Но полной ясности представления ещё нет.
Ответить с цитированием
  #24 (permalink)  
Старый 09.11.2015, 23:53
Аспирант
Посмотреть профиль Найти все сообщения от pnpquest
 
Регистрация: 09.11.2015
Сообщений: 94

Сообщение от nick1m
А колбэки, получается друг друга не блокируют?
Блокируют. В единственном потоке может исполняться только один коллбек. Они исполняются в порядке очереди, если поток занят.
Ответить с цитированием
  #25 (permalink)  
Старый 10.11.2015, 00:01
Аспирант
Посмотреть профиль Найти все сообщения от pnpquest
 
Регистрация: 09.11.2015
Сообщений: 94

Сообщение от nick1m
вывод колбэка одной и той же функции осуществляется вовсе не в порядке поступления запроса
не в порядке, но это звисит от внешних условий, а не от самого движка. Например от сети, от порядка обработки сервером. Например, экземпляр XMLHttpRequest, асинхронно отсылает запрос, а при получении ответа он запускает коллбек. Если одна функция посылает 2 запроса,, она, как правило создает 2 экземпляра XMLHttpRequest, и каждый экземпляр дожидается своего ответа. Не факт, что 1 ответ придет раньше второго
Ответить с цитированием
  #26 (permalink)  
Старый 10.11.2015, 00:21
Интересующийся
Отправить личное сообщение для nick1m Посмотреть профиль Найти все сообщения от nick1m
 
Регистрация: 31.10.2015
Сообщений: 29

Сообщение от pnpquest Посмотреть сообщение
не в порядке..
Понял, спасибо, именно это я и имел ввиду.
Ответить с цитированием
  #27 (permalink)  
Старый 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 в целом). Можно ли так сделать, судить не берусь.
Ответить с цитированием
  #28 (permalink)  
Старый 20.11.2015, 10:17
Интересующийся
Отправить личное сообщение для nick1m Посмотреть профиль Найти все сообщения от nick1m
 
Регистрация: 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)
}


Но, тем не менее, решает условие задачи в том виде, как оно представлено.
Ответить с цитированием
  #29 (permalink)  
Старый 23.11.2015, 02:47
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Сообщение от 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.
Ответить с цитированием
  #30 (permalink)  
Старый 23.11.2015, 03:38
Аспирант
Посмотреть профиль Найти все сообщения от pnpquest
 
Регистрация: 09.11.2015
Сообщений: 94

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите почему скрипт выполняется до завершения цикла Jigan2 jQuery 4 19.03.2015 00:08
Ожидание завершения ассинхронных функций KlausKater Общие вопросы Javascript 6 31.07.2014 05:37
Не понимаю JavaScript. Как сделать ожидание события загрузки данных? xintrea AJAX и COMET 7 01.06.2013 17:18
ожидание завершения ajax в событии GrigTheFirst AJAX и COMET 2 09.12.2011 04:01
.load() - ожидание загрузки KupueIIIKo jQuery 2 06.10.2011 11:46