0

我有一个 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 调用正确执行。

我错过了什么 - 谢谢。

4

4 回答 4

4

这是正常行为

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

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

错误修复

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

顺便说一句:jQuery 已弃用此参数,我对当前的 jQuery 版本并不是最新的,但它可能已经从 API 中删除。

好容易修复

否则(推荐)了解事件驱动的环境。它们不依赖于顺序的事物,但它们提供callback了在事件触发时要执行的函数——这意味着您需要处理的数据在声明时不可用,但在稍后的时刻可用。

如果你callback为一个事件声明一个click// jQuery 将存储的内容保存在某个地方,并且仅在(并且如果)事件被触发时执行它hover。它不会立即执行它,如果您不/ /任何它根本不会执行它。focuscallbackclickhoverfocus

与 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 - 触发传递的数据,以及许多其他有用(或不有用)的信息.

可能是最好的修复

有一些更新的功能我还没有读过(没有深入了解),据我了解,它们提供了一个基础设施,用于对一些尚不可用的信息应用操作,这些操作将在之后的某个时间应用数据变得可用。

http://api.jquery.com/category/deferred-object/

我无法解释这一点,因为我没有使用它并且除了上面可能错误的解释之外对它一无所知。如果有人有这方面的要点,请赐教。

于 2012-10-05T09:03:52.283 回答
0

$.ajax 是异步调用。所以它不会阻止以下代码的执行。这就是为什么return false会在 $.ajax 完成之前执行。

于 2012-10-05T09:03:55.920 回答
0

AJAX 调用异步执行,这意味着 getJSON 函数立即返回并继续执行下一行代码。您将不得不重新考虑您的逻辑,因为您的外部函数将在 AJAX 完成之前返回。

更好的想法是有一个从你的完整处理程序中调用的完成函数。

于 2012-10-05T09:04:18.660 回答
0

最后一个return false;在您的回调函数之外。这就是它首先执行的原因,我认为你根本不应该从这个函数返回 true 或 false,但可能在收到结果时对 DOM 做一些事情。

于 2012-10-05T09:06:26.010 回答