将javascript全局变量设置为JSONresult?

时间:2011-07-26 12:51:17

标签: javascript jquery json asp.net-mvc-3 global-variables

如何在onload事件中将js全局变量设置为json结果集?

    var global = [];

    $.getJSON("<%: Url.Action("myUrl", "con") %>/", 
     function(data) {
           $.each(data, function(key, val) {
             global.push(val);
           });
    });

global在加载时没有设置值,我需要在json调用之外访问它...

4 个答案:

答案 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)