具有Jquery函数的普通函数内的返回值

时间:2013-11-23 11:00:38

标签: jquery

在Jquery函数内返回时,返回值不起作用。 当我返回Jquery函数外部时它不能正常工作,因为return不等待Jquery函数,并且给出错误:Uncaught ReferenceError:result not not defined。

我该如何解决这个问题? 我应该将Jquery函数命名为count_with_min_max_val?

//counting precentage function   
function count_with_min_max_val(val, perc, min_val, min_val_limit, max_val, max_val_limit, action) {
    //ajax data
    var json_obj = {};
    json_obj.values = {
        "action": action,
            "value": val,
            "percent": perc,
            "min_val": min_val,
            "min_val_limit": min_val_limit,
            "max_val": max_val,
            "max_val_limit": max_val_limit

    };
    var json_obj = JSON.stringify(json_obj);

    $.post("pages/calc/calculator.php", {
        json_a: json_obj
    }).done(function (data) {
        result = data;
        alert(result); //that works
        return result; //doesn't return to main function                     
    });
    return result; //return doesnt wait for Jquery function to complete, and showing error
}

4 个答案:

答案 0 :(得分:1)

Ajax调用是异步的。添加async: false

$.ajax({
    type: "POST",
    url: "pages/calc/calculator.php",
    async: false,
    data: {
        json_a: json_obj
    },
    success: function(data){
        result = data;
        return result;
    }
});

同样如评论中所指出的,async已被弃用。以下是使用ajax回调的方法。

var result;
function ajaxCallback(response){
    result = response;
    console.log(response);
}

function count_with_min_max_val(val, perc, min_val, min_val_limit, max_val, max_val_limit, action){
    //ajax data
    var json_obj = {};
    json_obj.values = {
        "action": action,
        "value": val,
        "percent": perc,
        "min_val": min_val,
        "min_val_limit": min_val_limit,
        "max_val": max_val,
        "max_val_limit": max_val_limit
    };
    json_obj = JSON.stringify(json_obj);

    $.post("pages/calc/calculator.php", {
        json_a: json_obj
    }).done(ajaxCallback);
}

答案 1 :(得分:1)

这是不可能的,因为是异步调用。因此,在post完成后,在main函数返回之前执行done()函数。

可能的解决方案是将回调函数作为参数传递。例如:

// Do something with result
function callback(result) {
alert(result);
}

function count_with_min_max_val(callback, val, perc, min_val, min_val_limit, max_val, max_val_limit, action) {
    //ajax data
    var json_obj = {};
    json_obj.values = {
        "action": action,
            "value": val,
            "percent": perc,
            "min_val": min_val,
            "min_val_limit": min_val_limit,
            "max_val": max_val,
            "max_val_limit": max_val_limit

    };
    var json_obj = JSON.stringify(json_obj);

    $.post("pages/calc/calculator.php", {
        json_a: json_obj
    }).done(function (data) {
        result = data;
        callback(result);
    });
}

答案 2 :(得分:0)

尝试这样的事情

    $.ajax({
        type: "POST",
        url: "pages/calc/calculator.php",
        async: false,
        data: { json_a: json_obj }
        })
        .done(function( msg ) {
            result = data;
            alert(result); //that works
            return result; //doesn't return to main function     
        });
  

默认情况下,所有请求都是异步发送的(默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作

答案 3 :(得分:0)

非常感谢您的回答。 对您的评论来说,同步调用已过时且危险,因为它们可以锁定webbrowser。在ajax调用完成后,我决定使用函数回调。

(我的代码) (...)

$.post("pages/calc/calculator.php", {
   json_a: json_obj
}).done(function (data) {

   callback_function(data);

});

(...)

非常感谢,你是专家!