javascript функция jquery это как-то не так? - PullRequest
2 голосов
/ 10 октября 2011
function rebuildJSONObject(){
   $.getJSON('services.json', function(data) {
        //stof start
        var input = data;
        var output = { myservices: [] };
        for (var key in input) {
            if (input.hasOwnProperty(key)) {
                for (var i = 0, hostsinfo = input[key].hostsinfo; i < hostsinfo.length; i++) {
                    output.myservices.push({
                        'nametag': key,
                        'hostidn': hostsinfo[i]['hostidn'],
                        'details': hostsinfo[i]['details'],
                        'currstatus': hostsinfo[i]['currstatus'],
                        'currstatusclass': hostsinfo[i]['currstatusclass']
                    });
                }
            }
        }
        //stof end
        return output;
    });
}
//setting it for use later in the script
var serviceJSONObject = rebuildJSONObject();

Я знаю, что все, что происходит в функции, работает должным образом, потому что, если я применю его к событию щелчка, оно будет очаровательным.Однако я бы предпочел загрузить объект JSON в память один раз и поработать с ним на стороне клиента после сохранения.Моя проблема, однако, везде, где я называю «serviceJSONObject», я получаю «неопределенную» ошибку.

Итак, как я делаю это неправильно и как я могу определить переменную, подобную этой, в начале игры, а остальная часть сценарияможет использовать указанную переменную.

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

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

function rebuildJSONObject(serviceJSONObject){
   $.getJSON('services.json', function(data) {
        //stof start
        var input = data;

        // Use the serviceJSONObject that is passed into rebuildJSONObject
        serviceJSONObject = { myservices: [] };
        for (var key in input) {
            if (input.hasOwnProperty(key)) {
                for (var i = 0, hostsinfo = input[key].hostsinfo; i < hostsinfo.length; i++) {
                    serviceJSONObject.myservices.push({
                        'nametag': key,
                        'hostidn': hostsinfo[i]['hostidn'],
                        'details': hostsinfo[i]['details'],
                        'currstatus': hostsinfo[i]['currstatus'],
                        'currstatusclass': hostsinfo[i]['currstatusclass']
                    });
                }
            }
        }
        //stof end
    });
}
//setting it for use later in the script
var serviceJSONObject;
rebuildJSONObject(serviceJSONObject);
1 голос
/ 10 октября 2011

Есть несколько проблем с этим.

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

  2. Так, как сейчас, результаты не вернутся к serviceJSONObject. Оператор return output устанавливает возврат для анонимной функции, а не возвращаемое значение для rebuildJSONObject, поэтому результаты просто исчезнут. Если вы хотите, чтобы результаты были доступны в другом месте в коде, вам нужно либо сохранить их в глобальной переменной, либо получить доступ к ним внутри обратного вызова.

1 голос
/ 10 октября 2011

Почему бы не добавить свойство кэша в функцию, которая будет хранить результат начального вывода (загруженного через ajax) и возвращать сохраненное состояние при любом последовательном вызове.

function rebuildJSONObject(callback) {
    var self = this;

    if (typeof self.cache !== 'undefined') {
        if (typeof callback === 'function') {
            callback(self.cache);
        }
        return;
    }

    $.getJSON('services.json', function(data) {
        //stof start
        var input = data,
            output = { myservices: [] };

        for (var key in input) {
            if (input.hasOwnProperty(key)) {
                for (var i = 0, hostsinfo = input[key].hostsinfo; i < hostsinfo.length; i++) {
                    output.myservices.push({
                        'nametag': key,
                        'hostidn': hostsinfo[i]['hostidn'],
                        'details': hostsinfo[i]['details'],
                        'currstatus': hostsinfo[i]['currstatus'],
                        'currstatusclass': hostsinfo[i]['currstatusclass']
                    });
                }
            }
        }
        //stof end
        self.cache = output;

        if (typeof callback === 'function') {
            callback(self.cache);
        }

        return;
    });
}

РЕДАКТИРОВАТЬ: В первый раз вам нужно будет вызвать эту функцию асинхронно и предоставить функцию обратного вызова, например

rebuildJSONObject(function(output) {

    /*
     * Process your output here
     */

    console.log(output);

});

Каждый раз, когда вы снова можете использовать его синхронно:

console.log(rebuildJSONObject.cache);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...