Странным образом существующий объект
Добрый день. У меня какая-то неожиданная ситуация в которой я не могу разобраться, помогите пожалуйста.
У меня хранятся сообщения в массиве объектов, получаются они при помощи 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 и что такого кривого в моём коде. Браузер - ФФ. |
Без кода ничего не понятно.
Но если попробовать libastral… [telepathy-mode] Вы получаете новые сообщения асинхронным запросом. И проверяете его значение сразу после отправки запроса, т.е. до его выполнения. Логично, что результатов к тому моменту ещё не будет. alert же блокирует поток исполнения, так что запрос успеет выполниться. [/telepathy-mode] |
Скорее всего, вы выводите значение в консоль еще до того как завершен AJAX-запрос.
alert дает определенную задержку перед выводом в консоль, позволяя запросу завершиться. А вообще, конечно, в 17-й строке у вас ошибка. Млин, опоздал. LOL |
Стыдновато код выкладывать, буквально первый раз истользую 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)}); Обе функции не до конца, но там идёт отдельный код, который отношения не имеет. |
То есть, это уже отредактированная. Тут и alert стоит и console.log. Если alert убрать, то в лог ничего не пишется, кроме ошибки.
|
shoo, console.log нужно перенести внутрь callback функции success. Сразу после вызова метода concat
|
Спасибо, теперь всё работает. Но меня мучает вопрос: почему так? Вроде бы messages всегда на один и тот же массив ссылается. И почему после alert всё нормально выводится?
|
Цитата:
|
Затупил ._.
Спасибо ещё раз! |
Часовой пояс GMT +3, время: 06:53. |