getJSON jQuery工作位顺序错误
我有一个jQuery/JavaSCript函数: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
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请求触发该事件并传递该事件