从jQuery.getJSON返回JSON blob

时间:2012-09-25 20:51:52

标签: javascript jquery asp.net-mvc json lexical-scope

我有一个函数,我正在调用一个返回JSON blob的MVC控制器,其中包含一些后端操作的内容。此JSON blob用于填充呈现给最终用户的表。

我的功能目前看起来像这样:

function getJsonFromController(path) {
    var blob = null;

    $.getJSON(path, function (data) {
        blob = data;
        console.log('inside getjson : ' + blob);
    });

    console.log('outside getjson : ' + blob);
    return blob;
}

......还有一个看起来像这样的调用动作:

$('#action-button').click(new function () {
    blob = getJsonFromController('A/B?pageId=1');

    console.log('in click event: ' + blob);
    $.tmpl($template, blob).appendTo($('#table-body'));
});

当我运行调用此内容的网页/操作时,我会按给定顺序获得以下结果:

outside getjson: null
in click event: null
inside getjson: [object Object] 

我尝试了一些其他配置(.getJSON(.complete),直接从$ .getJSON()中返回一个值,以尝试将回调中的'data'回显到封闭范围的blob变量,但是到目前为止,blob似乎只在getJSON回调中有价值。

话虽如此,我也知道JavaScript是一种词法范围的语言,所以它可能是所有匿名函数链的执行问题。

问题:我可以看到我的blob在$ .getJSON中正确显示。现在,我如何让我的blob出来?

1 个答案:

答案 0 :(得分:1)

AJAX请求是异步的。您可以同步执行此操作(请注意,它会冻结您的网页,直到请求完成),但更好的做法是执行以下操作:

function getJsonFromController(path) {
    var blob = null;

    $.getJSON(path, function (data) {
        blob = data;
        console.log('inside getjson : ' + blob);
        $.tmpl($template, blob).appendTo($('#table-body'));
    });
}

然后点击:

$('#action-button').click(new function () {
    blob = getJsonFromController('A/B?pageId=1');
});