getJSON jQuery工作位顺序错误

getJSON jQuery工作位顺序错误,jquery,ajax,razor,Jquery,Ajax,Razor,我有一个jQuery/JavaSCript函数: function CheckPostcode() { // if checkbox is checked then hide and return true // if checkbox is not checked (visible or not) then check postcode is known via Ajax call // if not known then display the checkbox an

我有一个jQuery/JavaSCript函数:

function CheckPostcode() {
    // if checkbox is checked then hide and return true
    // if checkbox is not checked (visible or not) then check postcode is known via Ajax call
    // if not known then display the checkbox and return false
    //
    if ($('#perinatalWomanView_AcceptUnknownPostcode').is(':checked')) {
        $("#AcceptUnknownPostcode").hide();
        return true;
    }
    $.getJSON('@Url.Action("PostcodeCheck", "AjaxValidation", new { area = "" })', { postcode: $('#perinatalWomanView_Postcode').val() }, function (result) {
        if (result.postcodeFound == true) {    // executes SECOND
            $("#AcceptUnknownPostcode").hide();
            return true;
        }
        $("#AcceptUnknownPostcode").show();
        return false;
    });
    return false;    // executes FIRST
} //CheckPostcode
这似乎是正确的,但是AJAX getJSON响应是按顺序工作的(我分别使用Firebug和警报来检查这一点)。我对代码进行了注释,以显示执行顺序。Ajax调用正确执行

我错过了什么?谢谢。

这是正常的行为 这是正常的行为,因为AJAX本质上是异步的,这就是AJAX中的A所代表的

这意味着从外部资源(服务器)请求内容将并行工作,当收到结果时,您可以处理它们,但不能指望它们按顺序工作

坏主意 对于有顺序思维的人来说,有一个简单(但不好)的修复方法:使AJAX调用同步
$。getJSON
等于
$。ajax
它只是有一些预定义的参数;
$.ajax
接受的参数之一是
async
,默认情况下为true,将
$.getJSON
调用替换为等效的
$。ajax
调用只需添加
async:false
参数即可

顺便说一句:jQuery不推荐使用这个参数,我对当前的jQuery版本不太了解,但它可能已经从API中删除了

好容易解决 否则(建议)了解事件驱动环境。它们不依赖于事情的顺序,但它们提供了在触发事件时执行的
回调
函数-这意味着您需要处理的数据在声明时不可用,但在稍后的时刻可用

如果为
事件声明
回调
,请单击
/
悬停
/
焦点
事件jQuery将
回调
存储在某个位置,并且仅在触发事件时执行。它不会立即执行它,如果您不
单击
/
悬停
/
聚焦
任何内容,它都不会执行它

AJAX也是如此,您给jQuery一个回调函数,以便在服务器完成响应传输后立即运行

顺便说一句:这种修复在架构上并不容易在任何地方使用,如果数据上只有一层处理,那么它就可以工作,如果有更多的处理,并且涉及到逻辑,那么它就会变得混乱

更好更复杂的修复 这会使你走上正轨,再也不会偏离正轨

您可以创建自己的事件,命名为任何您喜欢的名称。附加事件处理程序以在触发该事件时执行

您只需告诉AJAX请求触发该事件并传递事件变量。已设置的事件处理程序将被调用,其余的将被调用

$('body').bind('my_event', function(event) {
    results_from_ajax = event.data;
});

$.getJSON(function(server_results) {
    $('body').trigger('my_event', server_results);
});
如果查看该函数,您将看到可以定义一些额外的参数以发送到事件处理程序

如果查看事件对象的结构,它包含event.type-事件名称、event.target-触发它的对象、event.data-触发传递的数据以及许多其他有用(或不可用)的信息

可能是最好的解决办法 有一些新功能我还没有读过(还没有深入了解),据我所知,它们提供了一个基础结构,用于将操作应用于一些尚未可用的信息,在数据可用后的某个时间将应用哪些操作

我无法解释这一点,因为我没有使用过它,除了上面可能错误的解释之外,我对它没有任何理解。如果有人知道这个要点,请告诉我们所有人。

这是正常的行为 这是正常的行为,因为AJAX本质上是异步的,这就是AJAX中的A所代表的

这意味着从外部资源(服务器)请求内容将并行工作,当收到结果时,您可以处理它们,但不能指望它们按顺序工作

坏主意 对于有顺序思维的人来说,有一个简单(但不好)的修复方法:使AJAX调用同步
$。getJSON
等于
$。ajax
它只是有一些预定义的参数;
$.ajax
接受的参数之一是
async
,默认情况下为true,将
$.getJSON
调用替换为等效的
$。ajax
调用只需添加
async:false
参数即可

顺便说一句:jQuery不推荐使用这个参数,我对当前的jQuery版本不太了解,但它可能已经从API中删除了

好容易解决 否则(建议)了解事件驱动环境。它们不依赖于事情的顺序,但它们提供了在触发事件时执行的
回调
函数-这意味着您需要处理的数据在声明时不可用,但在稍后的时刻可用

如果为
事件声明
回调
,请单击
/
悬停
/
焦点
事件jQuery将
回调
存储在某个位置,并且仅在触发事件时执行。它不会立即执行它,如果您不
单击
/
悬停
/
聚焦
任何内容,它都不会执行它

AJAX也是如此,您给jQuery一个回调函数,以便在服务器完成响应传输后立即运行

顺便说一句:这种修复在架构上并不容易在任何地方使用,如果数据上只有一层处理,那么它就可以工作,如果有更多的处理,并且涉及到逻辑,那么它就会变得混乱

更好更复杂的修复 这会使你走上正轨,再也不会偏离正轨

您可以创建自己的事件,命名为任何您喜欢的名称。附加事件处理程序以在触发该事件时执行

您只需告诉AJAX请求触发该事件并传递该事件