javascript jquery函数这是错误的?

时间:2011-10-10 09:32:04

标签: javascript jquery function

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 个答案:

答案 0 :(得分:2)

问题是在调用回调函数之前返回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 :(得分:1)

为什么不将缓存属性添加到将存储初始输出结果(通过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);

答案 2 :(得分:1)

这有几个问题。

  1. 对getJSON的调用是异步的,因此您需要注意,在调用返回结果之前不要尝试使用结果。

  2. 目前的方式,结果不会返回serviceJSONObjectreturn output语句设置匿名函数的返回值,而不是rebuildJSONObject的返回值,因此结果将消失。如果您希望结果在代码中可用,则需要将它们存储在全局变量中或在回调中访问它们。