我在一些看似没有更新全局变量的代码中有一个$ .getJSON调用,我很难理解为什么。正在加载JSON数据,但由于某种原因,for {}循环中没有更新全局EventOptions数组。大写注释引用变量。有任何想法吗?感谢
function LoadMeasurementTypes() {
// Clear out EventOptions
EventOptions = ["..."];
// Push a couple on to EventOptions - THESE ADD OK
EventOptions.push("Temperature");
EventOptions.push("Pulse rate");
// Call json to get measurementTypes off the table
$.getJSON('./get-measurement-types.php', function (measurementTypeData) {
// Process each json element ([0].BP, [1].ph (Urine) etc.
for (var i = 0; i < measurementTypeData.length; ++i) {
// e is a storage variable to contain the current element
var e = measurementTypeData[i];
// Add the new measurement type
alert(e.measure_type); // OK works - we can see the measure_type
EventOptions.push(e.measure_type); // THESE ARE NOT BEING ADDED
}
} // end anonymous function
) // end get json call
EventOptions.push("Last one"); // THIS ONE IS BEING ADDED
}
答案 0 :(得分:2)
您的EventOptions[]
无法全局显示。我的猜测是它仍然应该在$ .getJSON调用的本地可见;但因为现在它的范围是jquery,它显然是模糊的(你在你的anon函数中alert(EventOptions);
测试了吗?
要正确定位,只需将其声明在LoadMeasureTypes()
之外。
var EventOptions = ["..."];
function LoadMeasureTypes(){...
-update
如果这不起作用 - 你总是可以在$ .getJSON()之外拉匿名函数,并为它赋一个变量名:
var retreiveTypes = function(){...};
$.getJSON("..path/php", retreiveTypes);
答案 1 :(得分:1)
window.EventOptions = ["..."]
很好'ol“hack”把东西放在全球范围内
答案 2 :(得分:1)
得到答案:好吧。它不适用于iTouch Safari,但在Firefox(Mac)上运行良好。博斯沃思我认为这是你上面提到的浏览器问题。 有趣的是,它可能与线程有关。看起来out循环在内部匿名循环完成之前运行(警报不按顺序!)。我不认为javascript会以这种方式使用线程,但我可能错了。
我现在怀疑整个问题是时间问题 - 新线程作为匿名函数未能及时完成。
谢谢你们。