在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
}
答案 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);
});
(...)
非常感谢,你是专家!