Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Простите, у меня вопрос - а почему в AJAX обязательна функция обработчика события onreadystatechange и зачем вообще функции?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: не могу понять как избавиться и упростить, написав минимально-понятный скрипт (понять AJAX)
xcislav
Отправлено: 23 Апреля, 2014 - 10:48:38
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




В соответствии с минимально-работающим AJAX алгоритмом XMLHttpRequest();:
1. Создание экземпляра объекта XMLHtppRequest 2. Объявление обработчика события onreadystatechange экземпляра xhr 3. Открытие соединения с указанием типа запроса get post, URL и др. парам-в 4. Посыл запроса
И
CODE (javascript):
скопировать код в буфер обмена
  1. <script>
  2. function jupd() {
  3. var $j=new XMLHttpRequest();$j.onreadystatechange=function() {document.body.innerHTML=$j.responseText   }
  4. $j.open("GET", "/eho.php", true);
  5. $j.send();
  6. }
  7. setInterval(function(){jupd()}, 1);
  8. </script>
  9.  
  10. cat eho.php
  11. <?php echo microtime(); ?>
(минимальной программой для примера, <script>1.-8.),
хотелось бы поинтересоваться всеми тремя видами функций в минимально-работающем примере AJAX:
1.
.onreadystatechange=function(){}
(там - где всего одна(!) команда принимает и обрабатывает)
2.
setInterval(function(){jupd()}, 1);
(когда я заменил на setInterval(jupd(), 1); - программа решила для себя: сработаю всего разочек)
3. function jupd() {}
Общей функции "для" минимального AJAX. Но если setInterval работает, только с функцией (вызвав её) - то можно было бы избавиться вставив весь код в setInterval.

Иными словами убрав хоть эти несчастные две функции до одной... setInterval(function(){jupd({.onreadystatechange=function(){}})}, 1); jupd()
________________________________ __

Теоретически возможный ответ вами .onreadystatechange=function() - из теории
Вопрос слегка более интересный: почему setInterval вызывается комплексно.
И наверное самый вопрос за который я буду драться хотя он для меня не принципиален (так же и отступлю) - но драться продолжу вновь из-за принципов.
3. function jupd() {}
________________________________

Собственно мой вопрос и вам и у будущим читателям этого вопроса: помочь пояснить код минимальной учебной программы по строкам с точки зрения попыток (
почему будет или не будет работать
почему вообще работает
и как можно улучшить наглядность для изучающих ajax
(людей не прошедших тернии битв форумных троллей "штамп-лидеров/шаблонистов").
___________________
пожалуй начну - НАЧНУ ИЗДАЛЕКА...
Как я вижу ситуацию с AJAX:
Рабочий вариант спецификации (есть и перевод http://xmlhttprequest.ru/) говорит нам что асинхронного стандарта ещё нет (как (написано) не поддерживаются браузерами readyState статусы 0,1,2,3частично).
а конкретно:
Я попытался проделать замену с создания объекта xhr (переменная с долларом) на прямое xhr.*** по всей программе - не работает. Сделал вывод - до сих пор всё неопределенно (в рабочем стандартном написано что спецификация w3c будет всё меняться и ничего не гарантируется).
...
итоги:
? обязательные функции
? обязательные $-переменные/объекты (?инкарцерации форматы)

(Отредактировано автором: 23 Апреля, 2014 - 10:52:58)

 
 Top
esterio
Отправлено: 23 Апреля, 2014 - 11:05:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Вы хоть заглядивали в доку?
1. XMLHtppRequest 2 имеет не onreadystatechange а onload. хотя и первое также работает
2. setInterval не рекомендуеться к использованию. почему ичщем в гугле
3.
xcislav пишет:
readyState статусы 0,1,2

Зачем Вам эти статусы? статус 4 означает что запрос выполнен (тоесть не 200, а то что есть результат)
4. Вторым аргументом setInterval идет время в милисекундах. Вы же указали 1 мсек. Если мне не изменяет память то нельзя указивать меньше 54 мсек.

А теперь Вы много расписали но я так и не понял что Вам нужно. Вам нужно раз в 1 сек отправлять запрос?
 
 Top
IllusionMH
Отправлено: 23 Апреля, 2014 - 11:26:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




esterio, там речь о первом. Просто нет точки в конце предложения и нумерованный список в строку запиан.
Писать в таймер можно что угодно, но минимально значение 4мс.

xcislav, где вы нарыли этот код?
onreadystatechange - обязательна, здесь все обрабатывается. А больше функций и не нужно.
Таймер можно выкидывать, если не нужен запрос каждые n секунд, иначе писать разумный интервал.

Минимальные примеры написаны как на http://xmlhttprequest[dot]ru/ так и http://learn[dot]javascript[dot]ru/ajax-xmlhttprequest .
 
 Top
esterio
Отправлено: 23 Апреля, 2014 - 12:20:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




IllusionMH пишет:
но минимально значение 4мс

Я же описал что не помню точного значения, но 1 точно не катит.

Но все же если учитивать что setInerval с таким минимальним интервалом и то что идет 2 одновременних запросса (дрегие же идут в очередь), то можно представить какая там будет очередь. Ведь я не верю что он укладеться в 4 мс в запрос.
Лично я бы делал через setTimeout в onreadystatechange
 
 Top
IllusionMH
Отправлено: 23 Апреля, 2014 - 12:35:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




esterio, setTimeout(fn, 1) используется для переноса выполнения кода в конец "очереди" и ивент лупе. Все равно браузер выполнит это через свой минимальный интервал и не раньше чем дойдет очередь.
В данном случае явно бездумная копипаста/правка.

Да в большинстве случаев так бы и дедалось. Хотя в конечном счете получится нехилый уровень вложенности Недовольство, огорчение
Так что у таймаута тоже минусов хватает. Да и запросы на сервер - не отрисовка старницы. Погрешность интервала тут вообще по барабану(при разумном интрвале).
 
 Top
esterio
Отправлено: 23 Апреля, 2014 - 12:42:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




IllusionMH пишет:
setTimeout(fn, 1) используется для переноса выполнения кода в конец "очереди" и ивент лупе

Здесь можно поподробней если не сложно
 
 Top
IllusionMH
Отправлено: 23 Апреля, 2014 - 12:59:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)





esterio, примерно так. for для долгого синхронного кода, который явно дольше интервала.
Если запустить так, - интервал будет в конце. Если закоментирвоать строку с таймаутом, и убрать коммент с предыдущей - interval будет вторым.
CODE (htmlphp):
скопировать код в буфер обмена
  1. console.log('before');
  2.  
  3. //(function(){console.log('interval')})();
  4. setTimeout(function(){console.log('interval')}, 1);
  5.  
  6. var i = Math.pow(2, 30), j;
  7. while(--i) {
  8.     j = Math.sqrt(i);
  9. }
  10. console.log('after' + j);
  11. console.log('another');
  12. console.log('and another one');

И если копнуть дальше - только IE у меня вывел before перед тем как for надолго занял единственный процесс в котором выполняется JS (собственно он и должен вывести стркоу в консоли.)
Чтобы избежать этого, можно сделать вот так
CODE (javascript):
скопировать код в буфер обмена
  1. console.log('before');
  2.  
  3. //(function(){console.log('interval')})();
  4. setTimeout(function () {
  5.     setTimeout(function () {
  6.         console.log('interval')
  7.     }, 1);
  8.     var i = Math.pow(2, 30),
  9.         j;
  10.     while (--i) {
  11.         j = Math.sqrt(i);
  12.     }
  13.     console.log('after' + j);
  14.     console.log('another');
  15.     console.log('and another one');
  16. }, 1);

теперь браузер длинный фор добавит в конец очереди, и в косоли успеет отобразиться before. Вот это и есть основное предназначение такого кода.


P.S. Когда уже поправят парсер тегов кода, чтобы они не ломали оффтоп и предпросмотр сообщений?

(Отредактировано автором: 23 Апреля, 2014 - 13:05:55)

 
 Top
esterio
Отправлено: 23 Апреля, 2014 - 15:01:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




IllusionMH спасибо, буду разбираться ибо впервие такую штуку слишу
 
 Top
IllusionMH
Отправлено: 23 Апреля, 2014 - 15:13:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)





esterio, блин. Гуглил на английском, нашел английскую версию
В итоге в русской версии нашел http://learn[dot]javascript[dot]ru/event[dot][dot][dot]and-timing-depth

(Отредактировано автором: 23 Апреля, 2014 - 15:14:32)

 
 Top
esterio
Отправлено: 23 Апреля, 2014 - 15:44:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)





еще раз спасибо. прочитал и усвоил новое для себя. век живи век учись )
 
 Top
nerv
Отправлено: 23 Апреля, 2014 - 23:51:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




setTimeout(fn, 0) -> setImmediate(fn)

http://learn[dot]javascript[dot]ru/setimmediate

xcislav пишет:
Рабочий вариант спецификации (есть и перевод http://xmlhttprequest.ru/) говорит нам что асинхронного стандарта ещё нет (как (написано)

19.12.2007 в 13:43

читай новый материал

(Отредактировано автором: 23 Апреля, 2014 - 23:54:48)



-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB