在JS中使用回调操作局部变量

时间:2009-12-08 07:25:05

标签: javascript jquery ajax

这是我的jquery代码:

function check_hotel_exists(value, col)
{
        var url = base_url + 'ajax/checkuniquehotel';

        var response = false;

        $.get(url, {hotelname:value}, function(data){
            if (data === 'true') response = true;
        });

        alert((response) ? 'Hotel is Not Existing' : 'Hotel Exists');

        return [response, "That hotel already exists"];
}

响应的值不会改变。

如何使用get函数的回调更改响应值?我期待来自服务器响应的变量数据是'true'或'false'。

任何帮助将不胜感激。:)

5 个答案:

答案 0 :(得分:3)

该值不会更改,因为在check_hotel_exists函数退出后,应该将响应设置为true的ajax回调会异步执行。可能的解决方法是通过将async选项设置为false来同步执行ajax请求。

$.ajax({
    url: base_url + 'ajax/checkuniquehotel',
    async: false,
    data: { hotelname: value },
    success: function(result) {
        if (result === 'true') response = true;
    }
});

另一种解决方法是异步执行调用,但在这种情况下,所有工作都必须在success回调中完成,您的函数不再需要返回值(例如,如果酒店显示错误消息)名称已存在于成功回调中)。恕我直言,这是一个更好的方法。

答案 1 :(得分:0)

所有ajax请求都是异步的,因此您无法根据ajax调用的结果创建返回某些内容的函数。您应该异步处理响应(例如:在完成ajax调用后更改页面上的一段文本):

function check_hotel_exists(value, col)
{
    var url = base_url + 'ajax/checkuniquehotel';

    $.get(url, {hotelname:value}, function(data){
        var msg = (data === 'true') ? 'Hotel is Not Existing' : 'Hotel Exists';

        $("#resultmsg").text(response);
    });
}

答案 2 :(得分:0)

试试这个

function check_hotel_exists(value, col)
{
        var url = base_url + 'ajax/checkuniquehotel';

        var response = false;

        $.get(url, {hotelname:value}, function(data){
            if (data === 'true') response = true;
           alert((response) ? 'Hotel is Not Existing' : 'Hotel Exists');
           //this wont work, so do something else!!!!
           //return [response, "That hotel already exists"];
        });
}

答案 3 :(得分:0)

解决方案是让你的check_hotel_exists函数轮流异步,即接收函数作为回调参数:

function check_hotel_exists(value, col, callback)
{
        var url = base_url + 'ajax/checkuniquehotel';

        var response = false;

        $.get(url, {hotelname:value}, function(data){
            if (data === 'true') response = true;
            if (callback) {callback.call(response);}
        });
}

通过这种方式,您可以在任何想要检查酒店存在的地方拨打电话:

check_hotel_exists(value, col, function(response){
  alert(response);
});

答案 4 :(得分:-1)

肮脏的方法,但它的确有效:

将您的变量定义在回调函数之外:

var response = false;

function check_hotel_exists(value, col)
{
        var url = base_url + 'ajax/checkuniquehotel';

        response = false;

        $.get(url, {hotelname:value}, function(data){
            if (data === 'true') response = true;
        });

        alert((response) ? 'Hotel is Not Existing' : 'Hotel Exists');

        return [response, "That hotel already exists"];
}