powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Замыкания в JS
9 сообщений из 9, страница 1 из 1
Замыкания в JS
    #38661096
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Мне нужно заполнить массив данными из json. Запрос XHR. На статус запроса - функция. Вроде все хорошо, но после завершения работы функции, длина массива равна 0. Массив объявлен вроде бы в глобальной области. Непонятно, почему по завершении работы функции все результаты работы исчезают.

Вот код самой функции:
Код: 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.
30.
//объявление массива
var acntArray = new Array();

//сама функция
function getAcntArray()
{
	if ($.isEmptyObject(acntArray))
	{
	   xhttpMain=new XMLHttpRequest();
	   xhttpMain.open('GET','acn_list.json',true); 
	   xhttpMain.send();
		xhttpMain.onreadystatechange=function(){
		  if (xhttpMain.readyState==4){
			 //Принятое содержимое json файла должно быть вначале обработано функцией eval 
			 var json=eval( '('+xhttpMain.responseText+')' );
			 sessionStorage.setItem("acnCount", json.acn_list.length);
			 for (var i=0; i<json.acn_list.length; i++) 
			 {
			    acntArray[i,0] = json.acn_list[i].param;
				acntArray[i,1] = json.acn_list[i].param1;
				acntArray[i,2] = json.acn_list[i].param2;
				acntArray[i,3] = json.acn_list[i].param3;
			 }				
		  }
		  //здесь длина массива равна 4-м (количеству записей в JSON)
	   }
	   alert("Length of idArray: "+acntArray.length); //уже ЗДЕСЬ длина массива почему-то равна 0!
	   alert("Function getAcntArray is finished!");
	}
}
...
Рейтинг: 0 / 0
Замыкания в JS
    #38661120
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валисий, вызов alert("Length of idArray: "+acntArray.length) происходит до заполения массива, так как запрос асинхронный.
...
Рейтинг: 0 / 0
Замыкания в JS
    #38661124
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валисий, по шагам:
1. Вы инициализировали асинхронный запрос: xhttpMain.open('GET','acn_list.json',true);
2. Послали его серверу: xhttpMain.send();
3. Вывели сообщение: alert("Length of idArray: "+acntArray.length).

На момент вывода сообщение сервер ещё не прислал ответ. Учите матчасть.
...
Рейтинг: 0 / 0
Замыкания в JS
    #38661136
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, с алертом ясно. Дальше вот какой момент: я вызвал функцию, и хочу заполнить список данными.
Код: javascript
1.
2.
3.
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>');
}		


Список заполняется нужным количеством строк, но сами данные везде одинаковы (т.е. везде одно и то же, соответствующее последней записи из json). Почему так? Я посмотрел информацию о замыканиях, но особо не понял.
...
Рейтинг: 0 / 0
Замыкания в JS
    #38661151
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валисий,

А причем здесь вообще замыкания?
...
Рейтинг: 0 / 0
Замыкания в JS
    #38661171
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валисий, замыкания тут не при чём. Вам надо не про них читать, а про то как создать двумерный массив в JavaScript.
...
Рейтинг: 0 / 0
Замыкания в JS
    #38661173
Кавказ-сила
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: html
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.
<!DOCTYPE html>
<html>
<head>
  <script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <ol id="accnts" />
  <script>
    var _sessionStorage = { getItem: function() { return 3;} };
    var acntArray = [
      [000, 001, 002, 003],
      [100, 101, 102, 103],
      [200, 201, 202, 203]
    ];
    $(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>');
      }      
    });
  </script>
</body>
</html>

http://jsbin.com/xobovate/1/edit
...
Рейтинг: 0 / 0
Замыкания в JS
    #38661184
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валисий, вот так надо переписать:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
// Объявление массива
var acntArray = [];

// Сама функция
function getAcntArray() {
    if ($.isEmptyObject(acntArray)) {
        xhttpMain=new XMLHttpRequest();
        xhttpMain.open('GET','acn_list.json',true); 
        xhttpMain.send();

        xhttpMain.onreadystatechange = function() {
            if (xhttpMain.readyState==4) {
                // Принятое содержимое json файла должно быть вначале обработано функцией eval 
                var json=eval( '('+xhttpMain.responseText+')' );

                for (var i=0; i<json.acn_list.length; i++) {
                    acntArray[i] = [json.acn_list[i].param, json.acn_list[i].param1, json.acn_list[i].param2, json.acn_list[i].param3];
                }	
            }
        }
    }
}


Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
for (var i = 0; i < acntArray.length; 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
Замыкания в JS
    #38661205
Валисий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо! Да, таки не разобрался в работе с многомерными массивами в JS, я больше к Java привык)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Замыкания в JS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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