在javascript中更改变量值

在javascript中更改变量值,javascript,jquery,jqgrid,Javascript,Jquery,Jqgrid,我在document.ready()之前声明了全局变量 然后在document.ready函数中 beforeSubmit: function (postdata, formid) { $.getJSON('@Url.Action("","")', { Id: postdata.Id}, function (data) { getStatus =

我在document.ready()之前声明了全局变量

然后在document.ready函数中

beforeSubmit: function (postdata, formid) {
                     $.getJSON('@Url.Action("","")', { Id: postdata.Id},
                         function (data) {
                             getStatus = data;
                             alert(getStatus)// this give the correct status
                         });
                     alert(getStatus)//   but this one shows null
                     return [false];
                 },

我尝试了很多方法,但没有成功。请帮助我,Ajax请求是异步的。执行时,
$.getJSON
会立即执行下一行,即
警报(getStatus)
,同时未执行getJSON的success函数。它不会等待来自服务器的响应


因此,您只需要在成功事件中进行处理。

ajax请求是一个异步操作,这意味着它发送一个请求,当服务器发送其应答时,会调用success(或failure)方法。在您的情况下,这意味着当执行
$.getJSON
时,它会立即执行下一行,即
警报(getStatus)
。稍后,一旦从服务器收到响应,就会执行getJSON的success函数

如果您希望浏览器在执行任何其他操作(包括在ajax调用之后立即执行行)之前等待ajax调用完成,则需要使用常规ajax调用(而不是
getJSON
)并向其添加
async:false
,例如:

function (postdata, formid) {
    $.ajax({
        url: myUrl,
        dataType: 'json',
        async: false,
        data: myData,
        success: function(data) {
            getStatus = data;
            alert(getStatus);
        }
    });
    alert(getStatus);
    return [false];
}

AJAX是异步的!您的“this one shows null”将首先运行。在AJAX调用完成之前。一段时间后,在函数已经返回之后,当AJAX调用完成时,回调将运行,警报将显示正确的值。在那一秒
alert()
$getJSON()
还没有返回(或者甚至可能运行)然而,@janina:
$.getJSON
$.ajax
的缩写。这意味着
$.getJSON
实际上是在内部调用
$.ajax
。您需要做的是将涉及
getStatus
的所有内容都放在回调中。“真的没有必要使用全局变量,这就是回调/承诺的用途。@Rocket Hazmat能否请您给出一个简单的示例或链接,我从未使用过回调,我在谷歌上搜索过,但不知道哪一个在我的应用程序中有效。”case@janina:
功能(数据){
您的代码中有。这是回调。在那里您可以访问
数据
并使用它。虽然这样做有效,但不建议使用
async:false
,因为在AJAX调用完成之前,它将锁定浏览器(您不能单击页面上的任何内容)。
function (postdata, formid) {
    $.ajax({
        url: myUrl,
        dataType: 'json',
        async: false,
        data: myData,
        success: function(data) {
            getStatus = data;
            alert(getStatus);
        }
    });
    alert(getStatus);
    return [false];
}