Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Замыкания в JS / 9 сообщений из 9, страница 1 из 1
04.06.2014, 11:08
    #38661096
Валисий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкания в JS
Здравствуйте!
Мне нужно заполнить массив данными из 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
04.06.2014, 11:23
    #38661120
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкания в JS
Валисий, вызов alert("Length of idArray: "+acntArray.length) происходит до заполения массива, так как запрос асинхронный.
...
Рейтинг: 0 / 0
04.06.2014, 11:26
    #38661124
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкания в JS
Валисий, по шагам:
1. Вы инициализировали асинхронный запрос: xhttpMain.open('GET','acn_list.json',true);
2. Послали его серверу: xhttpMain.send();
3. Вывели сообщение: alert("Length of idArray: "+acntArray.length).

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

А причем здесь вообще замыкания?
...
Рейтинг: 0 / 0
04.06.2014, 11:57
    #38661171
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкания в JS
Валисий, замыкания тут не при чём. Вам надо не про них читать, а про то как создать двумерный массив в JavaScript.
...
Рейтинг: 0 / 0
04.06.2014, 11:57
    #38661173
Кавказ-сила
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкания в JS
Код: 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
04.06.2014, 12:05
    #38661184
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкания в JS
Валисий, вот так надо переписать:
Код: 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
04.06.2014, 12:15
    #38661205
Валисий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замыкания в JS
Всем большое спасибо! Да, таки не разобрался в работе с многомерными массивами в JS, я больше к Java привык)
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Замыкания в JS / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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