javascript jquery 函数是不是有点错误?

问题描述 投票:0回答:3
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
的地方都会收到“未定义”错误。

那么我怎么做错了,我该如何在游戏早期定义这样的变量,以便脚本的其余部分可以使用该变量。

javascript jquery function
3个回答
1
投票

问题是

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);

0
投票

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

0
投票

这有几个问题。

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

  2. 按照目前的情况,结果不会返回给

    serviceJSONObject
    return output
    语句正在设置匿名函数的返回值,而不是
    rebuildJSONObject
    的返回值,因此结果将消失。如果您希望结果在代码中的其他地方可用,您需要将它们存储在全局变量中或在回调中访问它们。

© www.soinside.com 2019 - 2024. All rights reserved.