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”的任何地方,我收到“未定义”错误。
那我怎么做错了?如何在游戏早期定义这样的变量,以便脚本的其余部分可以使用所述变量。
答案 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)
这有几个问题。
对getJSON的调用是异步的,因此您需要注意,在调用返回结果之前不要尝试使用结果。
目前的方式,结果不会返回serviceJSONObject
。 return output
语句设置匿名函数的返回值,而不是rebuildJSONObject
的返回值,因此结果将消失。如果您希望结果在代码中可用,则需要将它们存储在全局变量中或在回调中访问它们。