Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.12.2014, 16:07
Интересующийся
Отправить личное сообщение для Tsamsiyu Посмотреть профиль Найти все сообщения от Tsamsiyu
 
Регистрация: 26.09.2014
Сообщений: 19

Ajax, что ты делаешь?
Есть вот такой простой код:
var $settings = {};

    	var data = {
    		baseUrl : location.pathname,
    		debug_mode : false
    	};

    	$settings.getDebugMode = function () {
    		if (!data.debug_mode) {
    			$http.get(data.baseUrl + '?r=jssettings/index').then(function (response) {
					// console.log(response.data) // response приходит - все нормально.
					return "1";
				});
    		} else {
    			return "2";
    		}
             return "3";
    	};

console.log($settings.getDebugMode()); // выводит 3!!!!

При чем если вызвать эту функцию под ряд раз 10, будет выводиться именно тройка, и лишь после завершения 10 вызова функции начнутся выводиться логи аякс-ответов, которые кстати выполнятся также 10 раз)). Я конечно знал, что аякс выполняется асинхронно, но чтобы так!
Ответить с цитированием
  #2 (permalink)  
Старый 21.12.2014, 16:14
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Да хоть 10000 раз, это значения не имеет.
Функции обратного вызова ведь не в отдельном потоке работают. Ответы аякса ставятся в очередь, и сработают не раньше, чем завершится блок действий, который отправляет запросы.
Ответить с цитированием
  #3 (permalink)  
Старый 22.12.2014, 08:07
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Tsamsiyu,
Странно. А при чем тут асинхронность и аджакс вообще? Может у Вас с логикой проблемы?
tst=function(){
   if(true) {
     console.log("request was send") // эта ветка всегда выполняется -- запрос отсылается
   }else{
     return 2 // эта ветка никогда не выполнится
   }
   return 3 // возврат из ф-ции
}

console.log(tst())
console.log(tst())
console.log(tst())
console.log(tst())

//  request was send
//  3
//  request was send
//  3
//  request was send
//  3
//  request was send
//  3
Ответить с цитированием
  #4 (permalink)  
Старый 22.12.2014, 09:00
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

отрабатывает все верно, ты просто не понимаешь идею.
вот смотри, допустим есть вот такой код:
function one () {
 setTimeout(function () { console.log(1); }, 1000);
 console.log(2);
}
one();


setTimeout - эта функция, которая вызывает другую функцию, которая должна выполниться через 1 секунду
т.е. сначала в консоль упадет 2, а потом 1 (через секунду)
примерно такая же пертушка и с аякс. ты говоришь, что нужно выполнить функцию после того как придет ответ. при этом функция которую ты дергаешь getDebugMode - завершается
Ответить с цитированием
  #5 (permalink)  
Старый 22.12.2014, 13:10
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от Rise Посмотреть сообщение
Сравни время выполнения функции за 10 раз и время выполнения одного ajax запроса может просветлеешь.
Суть не в этом.
После отправки запроса можно воткнуть цикл секунд на 5, а ответ сервера придет через секунду после отправки. Но тогда все равно колбек будет ждать 4 секунды своей очереди, пока не завершится блок действий с отправкой запроса и циклом.
Ответить с цитированием
  #6 (permalink)  
Старый 22.12.2014, 15:33
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Rise,
С чего ты взял, что не ждет? В V8 -- ждет. А в FF, похоже, alert вообще не блочит аякс. Может там она вообще неблокирующая, надо проверить на досуге.
Ответить с цитированием
  #7 (permalink)  
Старый 22.12.2014, 15:59
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Rise,
Причем тут это? Ты же говорил про алерт
Сообщение от Rise
а почему тогда если поставить алерт после аякса колбек не ждет когда ты отобъешь алерт
Вот я тебе поясняю, что
Сообщение от Rise
если поставить алерт после аякса колбек не ждет
ЖДЕТ в 8, а в FF, похоже, алерт не блочит поток

Последний раз редактировалось krutoy, 22.12.2014 в 16:01.
Ответить с цитированием
  #8 (permalink)  
Старый 22.12.2014, 16:50
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Rise,
Во первых, ты съезжаешь с темы. Это был конкртный ответ на конкретную реплику.

Во вторых, по поводу "правильного поведения", это еще вопрос. В 8, например, я при разработке всегда исхожу, что алерт блокирующий, картинка складывается простая. а в ФФ я щас поэксперементировал, и выяснил, что не совсем логично, все таки получается. Например

setTimeout(function(){console.log("foo")})
console.log("bar")
//  bar
//  foo

Тут, несмотря на то, что задержка не выставлена, колбэк все равно бросается в очередь. А в фф, получается такая фигня. Если задержка ответа от сервера минимальна, (какая то задержка все равно есть, правильно), аджакс на какое-то время блочит поток, все таки, даже несмотря на асинхронность оного. То есть, выходит, мы делаем асинхронный запрос, а он на какое то время блочит поток, пытаясь выполнится синхронно. А по истечению какого то времени, бросает коллбек в очередь. И вот если он бросил, последующий алерт его не блочит. А если наоборот, отработал первым алерт из аякса, поток будет заблокирован, и следующий алерт не отработает, пока не уберешь первый. Такие дела...
В итоге, мы вообще не знаем, какой операцией является alert в общем случае. Она ведет себя по разному, в одном случае блокирует поток, в другом -- нет. Сколько таких случаев в разных вариациях может быть -- хз. Делаем вывод: поведение алерта вообще не предсказуемо.

Это все похоже на костыли, и это только усложняет написание кода. Лучше бы этого не было ни хуя. Бесит.

Последний раз редактировалось krutoy, 22.12.2014 в 16:56.
Ответить с цитированием
  #9 (permalink)  
Старый 22.12.2014, 17:03
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от Rise
не ими придуман язык.
Язык придуман конкретным челом, Айком, это не значит, что отвечает за весь процесс. И он там, кстати, сейчас, похоже ничего не решает. Ты не в курсе, как недавно его пидоры (в прямом смысле) скинули с поста главы?
Ответить с цитированием
  #10 (permalink)  
Старый 23.12.2014, 15:55
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от Rise
нет расскажи
http://polit.ru/news/2014/04/04/mozilla/
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Психологическая деформация программистов DreamTheater Оффтопик 59 24.03.2012 05:03
Как (эффективно) изучать JavaScript? JSTalker Общие вопросы Javascript 33 23.12.2010 03:13
Zend и Pear для нуба mycoding Серверные языки и технологии 52 13.12.2010 18:32
Браузер доказывает что не видит функцию SleepWalker Общие вопросы Javascript 7 17.06.2009 23:14