Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Странным образом существующий объект (https://javascript.ru/forum/misc/28757-strannym-obrazom-sushhestvuyushhijj-obekt.html)

shoo 01.06.2012 15:48

Странным образом существующий объект
 
Добрый день. У меня какая-то неожиданная ситуация в которой я не могу разобраться, помогите пожалуйста.
У меня хранятся сообщения в массиве объектов, получаются они при помощи 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 и что такого кривого в моём коде. Браузер - ФФ.

B@rmaley.e><e 01.06.2012 15:52

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

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

[telepathy-mode]
Вы получаете новые сообщения асинхронным запросом. И проверяете его значение сразу после отправки запроса, т.е. до его выполнения. Логично, что результатов к тому моменту ещё не будет.
alert же блокирует поток исполнения, так что запрос успеет выполниться.
[/telepathy-mode]

Amphiluke 01.06.2012 15:55

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


Млин, опоздал. LOL

shoo 01.06.2012 15:57

Стыдновато код выкладывать, буквально первый раз истользую 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)});

Обе функции не до конца, но там идёт отдельный код, который отношения не имеет.

shoo 01.06.2012 15:58

То есть, это уже отредактированная. Тут и alert стоит и console.log. Если alert убрать, то в лог ничего не пишется, кроме ошибки.

Amphiluke 01.06.2012 15:59

shoo, console.log нужно перенести внутрь callback функции success. Сразу после вызова метода concat

shoo 01.06.2012 16:04

Спасибо, теперь всё работает. Но меня мучает вопрос: почему так? Вроде бы messages всегда на один и тот же массив ссылается. И почему после alert всё нормально выводится?

Amphiluke 01.06.2012 16:07

Цитата:

Сообщение от B@rmaley.e><e
Вы получаете новые сообщения асинхронным запросом. И проверяете его значение сразу после отправки запроса, т.е. до его выполнения. Логично, что результатов к тому моменту ещё не будет.
alert же блокирует поток исполнения, так что запрос успеет выполниться.

Что непонятно в этом ответе?

shoo 01.06.2012 16:11

Затупил ._.
Спасибо ещё раз!


Часовой пояс GMT +3, время: 06:53.