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