JQuery AJAX обработчик успеха не изменяет глобальный объект - PullRequest
0 голосов
/ 27 апреля 2011

В моем коде ниже у меня есть функция, которая асинхронно загружает все файлы, необходимые для приложения, и когда все файлы загружены, я продолжаю выполнение приложения:

function loadDATA(){
    var numFILES=6;
    var numLoaded=0;

    var dfd=$.Deferred();
    function fetchJSON(fileName,toObj){
        $.ajax({url: fileName, dataType: 'json',
                success: function(data){
                    if(data){
                        toObj=data;
                    }
                    numLoaded++;
                    if(numLoaded==numFILES){dfd.resolve()};
                }
        });
    }

    fetchJSON(TOCfile,TOC);
    fetchJSON(MAPfile,MAP);
    fetchJSON(CONTENTfile,CONTENT);
    fetchJSON(TABLESfile,TABLES);
    fetchJSON(CAPTIONSfile,CAPTIONS);
    fetchJSON(BOXESfile,BOXES);

    return dfd;
}

Все объекты TOC, MAP, CONTENT, TABLES, CAPTIONS, BOXES предопределены глобально до {} в верхней части скрипта.

loaDATA называется так:

loadDATA().done(function(){
    //do stuff with all loaded data here
})

Все работает, как и ожидалось, за исключением того, что объектам GLOBAL не присвоено новое значение. ВНУТРИ обработчика success, toObj имеет значение data, но объект GLOBAL не изменяется. Зачем? Это имеет отношение к сфере?

Спасибо за любую помощь в этом.

1 Ответ

2 голосов
/ 27 апреля 2011

Вы изменяете то, на что указывает toObj, а не то, на что глобальное указывает, когда вы говорите toObj = data.

Например, это должно работать:

toObj.data = data;

Этопотому что вы добавляете новый атрибут.Кроме того, вы могли бы что-то вроде этого:

$.each(data, function(key, value) { 
    toObj[key] = value;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...