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
的地方都会收到“未定义”错误。
那么我怎么做错了,我该如何在游戏早期定义这样的变量,以便脚本的其余部分可以使用该变量。
问题是
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);
为什么不向函数添加缓存属性来存储初始输出的结果(通过 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);
这有几个问题。
对 getJSON 的调用是异步的,因此您需要小心,不要在调用返回结果之前尝试使用结果。
按照目前的情况,结果不会返回给
serviceJSONObject
。 return output
语句正在设置匿名函数的返回值,而不是rebuildJSONObject
的返回值,因此结果将消失。如果您希望结果在代码中的其他地方可用,您需要将它们存储在全局变量中或在回调中访问它们。