Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.06.2012, 15:48
Интересующийся
Отправить личное сообщение для shoo Посмотреть профиль Найти все сообщения от shoo
 
Регистрация: 01.06.2012
Сообщений: 14

Странным образом существующий объект
Добрый день. У меня какая-то неожиданная ситуация в которой я не могу разобраться, помогите пожалуйста.
У меня хранятся сообщения в массиве объектов, получаются они при помощи AJAX в формате JSON.

new_messages = JSON.parse(msg)["messages"];
messages = messages.concat(new_messages);

Новые сообщения приходят, парсятся и добавляются в общий массив.
Ну и затем, в упрощённой форме, я пытаюсь вывести их в консоль, но этого не выходит, ибо undefined. Странно, но если перед выводом поставить alert, то на alert выводится пустота, но зато в консоль затем идут заполненные объекты, т.е. выводит то, что нужно.
alert(messages);
console.log(messages);


Если два раза подряд сделать console.log, то оба будут undefined.
В чём дело? Я не могу понять, что такого волшебного в alert и что такого кривого в моём коде. Браузер - ФФ.
Ответить с цитированием
  #2 (permalink)  
Старый 01.06.2012, 15:52
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Без кода ничего не понятно.

Но если попробовать libastral…

[telepathy-mode]
Вы получаете новые сообщения асинхронным запросом. И проверяете его значение сразу после отправки запроса, т.е. до его выполнения. Логично, что результатов к тому моменту ещё не будет.
alert же блокирует поток исполнения, так что запрос успеет выполниться.
[/telepathy-mode]
Ответить с цитированием
  #3 (permalink)  
Старый 01.06.2012, 15:55
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

Скорее всего, вы выводите значение в консоль еще до того как завершен AJAX-запрос.
alert дает определенную задержку перед выводом в консоль, позволяя запросу завершиться.
А вообще, конечно, в 17-й строке у вас ошибка.


Млин, опоздал. LOL
Ответить с цитированием
  #4 (permalink)  
Старый 01.06.2012, 15:57
Интересующийся
Отправить личное сообщение для shoo Посмотреть профиль Найти все сообщения от shoo
 
Регистрация: 01.06.2012
Сообщений: 14

Стыдновато код выкладывать, буквально первый раз истользую JS и jQuery. Но вот, функция, которая собственно получает сообщения:
function getMessageList(messages) {
            var last_id = 0;
            var new_messages;


            for (var message in messages) {
                if (message["id"]>last_id) {
                    last_id = message["id"];

                }
            }

            $.ajax({
                type: "GET",
                url: "message.php",
                data: { action: "list", last_id:  last_id},
                success: function(msg) {


                    new_messages = JSON.parse(msg)["messages"];

                    messages = messages.concat(new_messages);

                }
            })


            alert(messages);
            console.log(messages);


И вот как она вызывается:
$(document).ready(function(){
            var messages = [];
            getMessageList(messages);

            $("#refresh_button").click(function () {getMessageList(messages)});

Обе функции не до конца, но там идёт отдельный код, который отношения не имеет.
Ответить с цитированием
  #5 (permalink)  
Старый 01.06.2012, 15:58
Интересующийся
Отправить личное сообщение для shoo Посмотреть профиль Найти все сообщения от shoo
 
Регистрация: 01.06.2012
Сообщений: 14

То есть, это уже отредактированная. Тут и alert стоит и console.log. Если alert убрать, то в лог ничего не пишется, кроме ошибки.
Ответить с цитированием
  #6 (permalink)  
Старый 01.06.2012, 15:59
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

shoo, console.log нужно перенести внутрь callback функции success. Сразу после вызова метода concat
Ответить с цитированием
  #7 (permalink)  
Старый 01.06.2012, 16:04
Интересующийся
Отправить личное сообщение для shoo Посмотреть профиль Найти все сообщения от shoo
 
Регистрация: 01.06.2012
Сообщений: 14

Спасибо, теперь всё работает. Но меня мучает вопрос: почему так? Вроде бы messages всегда на один и тот же массив ссылается. И почему после alert всё нормально выводится?
Ответить с цитированием
  #8 (permalink)  
Старый 01.06.2012, 16:07
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

Сообщение от B@rmaley.e><e
Вы получаете новые сообщения асинхронным запросом. И проверяете его значение сразу после отправки запроса, т.е. до его выполнения. Логично, что результатов к тому моменту ещё не будет.
alert же блокирует поток исполнения, так что запрос успеет выполниться.
Что непонятно в этом ответе?
Ответить с цитированием
  #9 (permalink)  
Старый 01.06.2012, 16:11
Интересующийся
Отправить личное сообщение для shoo Посмотреть профиль Найти все сообщения от shoo
 
Регистрация: 01.06.2012
Сообщений: 14

Затупил ._.
Спасибо ещё раз!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Страничка получает объект с null-значением от java-апплета JavaCommando Общие вопросы Javascript 1 27.11.2011 10:58
Передать ссылку на объект а не объект возникновения события Blazze Events/DOM/Window 0 11.10.2011 00:45
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Общие вопросы Javascript 1 13.04.2011 22:09
Можно ли удалить клонированный объект Евгений_86 jQuery 6 13.04.2011 12:54
Получить объект содержащий caller no_alex Общие вопросы Javascript 14 20.03.2009 21:37