Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Синхронный запрос / 12 сообщений из 12, страница 1 из 1
05.06.2014, 11:46
    #38662376
Валисий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
Здравствуйте!
Вчера была тема "Мистика в JS", у меня похожая ситуация) Привожу код с комментариями:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
function getAcntArray()
{
	if ($.isEmptyObject(acntArray))
	{
	   xhttpMain=new XMLHttpRequest();
	   xhttpMain.open('GET','acn_list.json',true); 
	   xhttpMain.send();
		xhttpMain.onreadystatechange=function(){
		  if (xhttpMain.readyState==4){
			 var json=eval( '('+xhttpMain.responseText+')' );
			 sessionStorage.setItem("acnCount", json.acn_list.length);
			 for (var i=0; i<json.acn_list.length; i++) 
			 {
			    acntArray[i] = [json.acn_list[i].param1, json.acn_list[i].param2, json.acn_list[i].param3, json.acn_list[i].param4];
			 }	 
		  }
	   }
	}
	else alert("acntArray is not empty");
}

$(document).on("pageinit", "#main", function() {
		
getAcntArray(); //здесь выполняется XHR-запрос. Работает нормально
//если вот здесь добавить алерт, то все нормально работает. Если не добавлять - ошибка "acntArray[i] is undefined" на след. строке
//запрос, видимо, не успевает выполниться
for (var i=0; i<sessionStorage.getItem("acnCount"); i++) {
   $("#accnts").append('<li data-value="'+acntArray[i][0]+'"><a href="#acn_actions"><p class="ui-li-heading">'+acntArray[i][1]+'. '+acntArray[i][2]+'</p><p class="ui-li-desc">Комментарий пользователя</p><p class="ui-li-aside ui-li-desc">'+((-1)*acntArray[i][3])+' '+'</p></a></li>');
}		 



Пытался в строке
Код: javascript
1.
xhttpMain.open('GET','acn_list.json',true); 

вместо true поставить false, типа выполнить синхронный запрос - не помогло. Посоветуйте, пожалуйста, что делать. Я думал поставить setTimeout на весь код, который после вызова getAcntArray(), но это не выход - если запрос длится дольше чем время таймаута, появится ошибка.
...
Рейтинг: 0 / 0
05.06.2014, 12:05
    #38662405
Gustly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
Валисий,

Не проще ли все это обернуть в функцию. А функцию вызывать в проверке 4-го состояние запроса?
...
Рейтинг: 0 / 0
05.06.2014, 12:08
    #38662410
Валисий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
Суть в том, что мне нужно на разных этапах работы проверять, не пустой ли массив acntArray. Если пустой - заполнять. Я привел тот случай, когда мне нужно проверить его на пустоту и заполнить им список. Есть другие моменты. Поэтому обернуть все в функцию не могу. Или я Вас неправильно понял?
...
Рейтинг: 0 / 0
05.06.2014, 12:31
    #38662433
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
Валисий, синхронный запрос делать не надо. Он подвесит на фиг браузер. Нужно код заточить под асинхронность.
...
Рейтинг: 0 / 0
05.06.2014, 12:33
    #38662434
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
ВалисийСуть в том, что мне нужно на разных этапах работы проверять, не пустой ли массив acntArray. Если пустой - заполнять.сделай так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function getAcntArray(callback) {
    if ($.isEmptyObject(acntArray)) {
        var xhttpMain=new XMLHttpRequest();
        xhttpMain.open('GET', 'acn_list.json', true); 
        xhttpMain.onreadystatechange=function(){
            if ((xhttpMain.readyState==4) && (xhttpMain.status == 200)){
                var json=eval( '('+xhttpMain.responseText+')' );
                sessionStorage.setItem("acnCount", json.acn_list.length);
                for (var i=0; i<json.acn_list.length; i++)  {
                    acntArray[i] = [json.acn_list[i].param1, json.acn_list[i].param2, json.acn_list[i].param3, json.acn_list[i].param4];
                }
                callback();
            }
        };
        xhttpMain.send();
    } else {
        callback();
    }
}



потом вызывать так:
Код: javascript
1.
2.
3.
4.
5.
getAcntArray(function() {
    for (var i=0; i<sessionStorage.getItem("acnCount"); i++) {
        $("#accnts").append('<li data-value="'+acntArray[i][0]+'"><a href="#acn_actions"><p class="ui-li-heading">'+acntArray[i][1]+'. '+acntArray[i][2]+'</p><p class="ui-li-desc">Комментарий пользователя</p><p class="ui-li-aside ui-li-desc">'+((-1)*acntArray[i][3])+' '+'</p></a></li>');
    }
});
...
Рейтинг: 0 / 0
05.06.2014, 12:33
    #38662435
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
Валисий, начинайте читать отсюда: Учебник » AJAX » Введение в AJAX и COMET .
...
Рейтинг: 0 / 0
05.06.2014, 12:37
    #38662440
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
мой вариант хорошо прокатит, если getAcntArray будет вызываться нечасто.
иначе может быть несколько случаев $.isEmptyObject(acntArray), и в итоге несколько запросов.
в этом случае надо хранить флаг наличия запроса и callback ставить в очередь, по onreadystatechange снимать флаг и выполнять все калбеки из очереди.
...
Рейтинг: 0 / 0
05.06.2014, 12:40
    #38662446
Валисий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
Яростный Меч, не помог callback. Работает (ошибку не выдает), но список пустой.
А что я должен в том учебнике про аякс прочитать?
...
Рейтинг: 0 / 0
05.06.2014, 13:07
    #38662474
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
ВалисийЯростный Меч, не помог callback. Работает (ошибку не выдает), но список пустой.запускай в хроме, нажимай F12, смотри под отладчиком, что и как выполняется, где косяк.

или вывод в лог делай, функция console.log, она в отличие от алерта и дебаггера не мешает асинхронности.
...
Рейтинг: 0 / 0
05.06.2014, 13:13
    #38662486
Валисий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
Яростный меч, я так понял, что просто колбэк-функция не отрабатывает.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
getAcntArray(function() {
   alert("!");
   for (var i=0; i<sessionStorage.getItem("acnCount"); i++) {
	$("#accnts").append('<li data-value="'+acntArray[i][0]+'"><a href="#acn_actions"><p class="ui-li-heading">'+acntArray[i][1]+'. '+acntArray[i][2]+'</p><p class="ui-li-desc">Комментарий пользователя</p><p class="ui-li-aside ui-li-desc">'+((-1)*acntArray[i][3])+' '+'</p></a></li>');
		 }		 
   alert("!!");
   $("#accnts").listview('refresh');
});


Ни один алерт не сработал.
...
Рейтинг: 0 / 0
05.06.2014, 14:14
    #38662580
Валисий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
И, судя по всему, XHR-запрос не проходит: я поставил алерты после onreadystatechange и после if (readystate==4), и опять же, ни один алерт не сработал.
...
Рейтинг: 0 / 0
05.06.2014, 15:24
    #38662710
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронный запрос
Валисий, современные браузеры имеют инсрументы отладки. Не за чем алерты расставлять.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Синхронный запрос / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]