Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   $.getJSON помогите разобраться. (https://javascript.ru/forum/jquery/72142-%24-getjson-pomogite-razobratsya.html)

Dark Souls 11.01.2018 14:41

$.getJSON помогите разобраться.
 
Уважаемые гуру!, объясните пожалуйста, почему:
var massive = {};

$.getJSON('url', RespFunc);
function RespFunc(data) {
    // если я обрабатываю data прямо в этой функции -
    alert(data[0].name); // работает как положено

    // а если -
    massive.resp = data;
}
alert(JSON.stringify(massive.resp)); // или ерунда какая-то или undefind


Ковыряя просторы Google так и не понял как правильно ей пользоваться.
Задача состоит в том, чтобы массиву присвоить ответ. :help:

Если можно. с пояснениями работы данного чуда.
Примного благодарен! :)

Nexus 11.01.2018 14:43

Dark Souls, $.getJson создает асинхронный запрос, поток при этом не блокируется.
В строке 11 в момент её выполнения объект "massive" еще пустой.

Dark Souls 11.01.2018 14:45

Цитата:

Сообщение от Nexus (Сообщение 474810)
Dark Souls, $.getJson создает асинхронный запрос, поток при этом не блокируется.
В строке 11 в момент её выполнения объект "massive" еще пустой.

И как это исцелить?
setTimeout - это жлобство... Есть толковое решение?

Pavel M. 11.01.2018 14:57

alert внутрь RespFunc

Nexus 11.01.2018 14:58

Dark Souls, можете выполнять необходимые действия в функции "RespFunc" либо обернуть запрос в "Promise".

new Promise(function(resolve){
    $.getJSON('url', function(res){
        resolve(res);
    });
}).then(function(res){
    alert(JSON.stringify(res));
});

Dark Souls 11.01.2018 16:11

Что то не вышло.

document.addEventListener('load', init(), false);
function init() {
    var massive = {};
    massive.all = new Promise(function (resolve) { 
        $.getJSON('url', function (data) { resolve(data); })
    }).then(function (responce) { return responce; });
    return massive;
}
alert(JSON.stringify(init())); // {}


как то можно сделать так, что-бы пока не проинициализируется объект в init(), крутился прелоадер и не выполнялась остальная часть кода?

Nexus 11.01.2018 16:53

Цитата:

Сообщение от Dark Souls
document.addEventListener('load', init(), false);

Удалите выделенное красным.

upd. написанное выше не поможет, у вас вообще все неправильно...
Возьмите код с пятого сообщения этой темы и поиграйтесь с ним.

upd2. почитайте, вроде бы подходящая для вас статья.

Dark Souls 11.01.2018 18:28

Спасибо! Вроде разобрался... :)


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