可能重复:
从 $.ajax() 函数内部返回值
我正在开发一个使用广泛的 AJAX 调用控制器的 CakePHP 应用程序。我遇到了一个特定的 AJAX 调用,我试图将来自控制器的响应分配给一个 JS 全局变量。这是代码:
window.errors = "";
function setErrors(err) {
window.errors = err;
}
function ajaxCall(u, t, d, dt) {
var type = typeof t !== 'undefined' ? t : "post";
var dataType = typeof dt !== 'undefined' ? dt : "json";
var success = false;
var err = "";
$.ajax({url: url, data: "data=" + d, type: type, dataType: dataType,
success: function(d){
if(d.hasOwnProperty('success') === false) { //json response
for(var i in d) { //fetch validation errors from object
for(var j in i) {
if(typeof d[i][j] === "undefined") {
continue;
}
err += d[i][j] + "<br/>";
}
}
console.log(err); //<=== displays correct value
setErrors(err); //<=== but somehow this seems to be failing??
}
else {
if(d.success === "1") {
success = true;
}
}
}
});
return success; //<=== I suspect this might be the culprit
}
这就是 ajaxCall() 的使用方式:
function register() {
var data = {};
var $inputs = $("#regForm :input");
$inputs.each(function(){
data[this.name] = $(this).val();
});
data = {"User" : data }; //CakePHP compatible object
data = JSON.stringify(data);
//Here's the AJAX call
if(ajaxCall('https://localhost/users/add', 'post', data, 'json')) {
alert("Registered!");
}
else {
alert(window.errors); // <=== empty string
console.log("window.errors is: " + window.errors); // <=== empty string
}
}
但在 Chrome JS 控制台上,window.errors
返回正确的值(非空,验证错误字符串)。
我发现了一个类似的问题,可能正在解决我的问题(return success
紧随其后的是在回调$.ajax()
之前执行)。success:
如何在不大幅更改代码的情况下解决此问题(另外,我不想将其设为同步调用)?