powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Синхронный запрос
12 сообщений из 12, страница 1 из 1
Синхронный запрос
    #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
Синхронный запрос
    #38662405
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валисий,

Не проще ли все это обернуть в функцию. А функцию вызывать в проверке 4-го состояние запроса?
...
Рейтинг: 0 / 0
Синхронный запрос
    #38662410
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть в том, что мне нужно на разных этапах работы проверять, не пустой ли массив acntArray. Если пустой - заполнять. Я привел тот случай, когда мне нужно проверить его на пустоту и заполнить им список. Есть другие моменты. Поэтому обернуть все в функцию не могу. Или я Вас неправильно понял?
...
Рейтинг: 0 / 0
Синхронный запрос
    #38662433
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валисий, синхронный запрос делать не надо. Он подвесит на фиг браузер. Нужно код заточить под асинхронность.
...
Рейтинг: 0 / 0
Синхронный запрос
    #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
Синхронный запрос
    #38662435
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валисий, начинайте читать отсюда: Учебник » AJAX » Введение в AJAX и COMET .
...
Рейтинг: 0 / 0
Синхронный запрос
    #38662440
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мой вариант хорошо прокатит, если getAcntArray будет вызываться нечасто.
иначе может быть несколько случаев $.isEmptyObject(acntArray), и в итоге несколько запросов.
в этом случае надо хранить флаг наличия запроса и callback ставить в очередь, по onreadystatechange снимать флаг и выполнять все калбеки из очереди.
...
Рейтинг: 0 / 0
Синхронный запрос
    #38662446
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Яростный Меч, не помог callback. Работает (ошибку не выдает), но список пустой.
А что я должен в том учебнике про аякс прочитать?
...
Рейтинг: 0 / 0
Синхронный запрос
    #38662474
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВалисийЯростный Меч, не помог callback. Работает (ошибку не выдает), но список пустой.запускай в хроме, нажимай F12, смотри под отладчиком, что и как выполняется, где косяк.

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


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