0

我在 jQuery 中编写了这个函数:

function checkAvailability(value) {
    var result = true;
    $.getJSON("registration/availability", { username: value }, function(availability) {            
        if (!availability)
            result = false; 
            alert("in getJSON: " + result);
    });
    alert(result);
    return result;
}

在这一秒之后,我收到了来自“getJSON”的警报。为什么会这样?

我有检查用户名可用性的 Spring MVC 项目和 Controller 方法。控制器方法正常工作。但我收到最终结果为时已晚。如何同步它以在我的函数中正确返回值?

编辑

我在 jQuery 验证中使用这个函数。我checkAvailability()在测试期间提取了函数。

$.validator.addMethod("checkAvailability", function(value, element, param) {    
    var das = checkAvailability(value);
    return das;
}, jQuery.format("Someone already has that username. Please try another one."));

这是我的表单验证:

$(".form").validate({
    rules: {
        username: {
            checkAvailability: true
        },
        ....
    },
    messages: {
    }
});

编辑 2

这是我的控制器方法。它返回布尔值。如果使用用户名,它将返回错误值。

@RequestMapping(value="/registration/availability", method = RequestMethod.POST)
public @ResponseBody boolean getAvailability(@RequestParam String username) {       
    List<User> users = getAllUsers();           

    for (User user : users) {
        if (user.getUsername().equals(username)) {
            return false;
        }
    }

    return true;
}
4

2 回答 2

1

为什么会这样?

$.getJSON是发出 AJAX 请求的简写。ajax 中的“A”代表异步。意思是,javascript 引擎触发 getJSON 调用,然后立即执行下一行,即alert(result); return result;

Web 服务返回的实际值将在稍后由您的代码接收。success一旦 js 引擎收到来自服务器的响应,您传递给 getJSON的函数就会被调用。如您所见,到那时为时已晚。

进一步阅读:https ://developer.mozilla.org/en/AJAX

我能做些什么来完成这项工作?

这取决于你的情况。谁在呼唤checkAvailabilty?如果您发布一些有关如何使用此功能的代码,我可以举一些例子和我的建议。

在我的脑海中,您可以使用jquery deferreds ,同样的好文章。或者你可以传入一个从你的成功函数内部执行的回调函数。

编辑:

http://docs.jquery.com/Plugins/Validation/Methods/remote#options

服务器端资源通过 $.ajax (XMLHttpRequest) 调用并获取一个键/值对,对应于已验证元素的名称及其作为 GET 参数的值。响应被评估为 JSON 并且对于有效元素必须为 true,对于无效元素可以是任何 false、未定义或 null,

要获得真实世界的想法,请查看演示http://jquery.bassistance.de/validate/demo/captcha/

打开 Firebug 或您选择的开发人员工具。转到可让您查看 AJAX 请求的选项卡。输入验证码,提交。检查开发人员工具中列出的 ajax 请求。注意查询字符串参数。注意响应。它是一个简单的“真”或“假”。

于 2012-07-13T10:56:26.777 回答
0

不确定这是否有帮助,但您可以使用

var result;
$.ajax( {
        url : "registration/availability",
        data : data,
        async : false  //syhcrononous ajax request ;)
}).done(function(data) {
    result = data;
});

有关更多信息,您可以参考JQuery AJAX 文档

于 2012-07-13T15:02:52.823 回答