如何在onload事件中将js全局变量设置为json结果集?
var global = [];
$.getJSON("<%: Url.Action("myUrl", "con") %>/",
function(data) {
$.each(data, function(key, val) {
global.push(val);
});
});
global在加载时没有设置值,我需要在json调用之外访问它...
答案 0 :(得分:2)
你了。也许试试
var result;
$.ajax({
url: '<%: Url.Action("myUrl", "con") %>/',
dataType: 'json',
async: false,
success: function(data) {
result = data;
}
});
// process result here
答案 1 :(得分:0)
您无需将global设置为数组。只需指定值。
var global = null;
$.getJSON("<%: Url.Action("myUrl", "con") %>/",
function(data) {
$.each(data, function(key, val) {
global = val;
});
});
答案 2 :(得分:0)
该代码应该可以正常工作。 (Live copy)听起来有一个问题,即ajax调用没有以你期望的形式返回数据。
答案 3 :(得分:0)
正如@marc(间接)指出的那样,你必须了解ajax调用和事件模型的本质。 解析JS文件后立即执行ajax调用,结果返回异步。因此,您的代码时间表看起来像
00 set global = []
01 AJAX call /someurl/ -------------------\
02 check global /* it's empty */ \
03 do something else [process AJAX call on server, send result]
... /
42 AJAX call is completed <----------------/
43 call success ----------------------------------> global.push(result)
44 at this point of time you can access global
这是时间表,而不是执行顺序。 AJAX调用和响应之间的时间可能是任意的,包括超时或服务器端错误
那么,你应该怎么做?
1)JS的正常解决方案 - 一个回调,你已经拥有的成功函数可以
1.1)设置全局并调用另一个函数,或
1.2)使用数据执行所需的操作
2)事件 - 如果你想在代码的多个部分中使用数据,那么更好,阅读jQuery事件机制
3)同步调用,正如@marc所暗示的那样 - 在99%的情况下应该避免这种情况。我知道可能需要它的唯一情况是你需要从第三方源请求强制数据,甚至在这种情况下你可以在服务器上执行它(尽管至少可以接受同步AJAX)