没有通过ajax调用设置Javascript全局变量
Javascript global variable not being set from ajax call
可能重复:
$.ajax()函数内部的返回值
我正在开发一个CakePHP应用程序,它利用了对控制器的广泛AJAX调用。我遇到了一个特殊的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
}
}
但在ChromeJS控制台上,window.errors
返回正确的值(非空,验证错误字符串)。
我发现了一个类似的问题,可能正在解决我的问题(紧接在$.ajax()
之后的return success
在success:
回调之前执行)。如何在不彻底更改代码的情况下修复此问题(此外,我不想将其作为同步调用)?
return
语句在成功回调之前运行是正确的。您不能从函数返回结果,因为函数必须在处理成功事件之前返回。
向ajaxCall
函数添加一个回调,并调用它而不是设置成功变量:
function ajaxCall(u, t, d, dt, callback) {
var type = typeof t !== 'undefined' ? t : "post";
var dataType = typeof dt !== 'undefined' ? dt : "json";
$.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/>";
}
}
callback(false, err);
} else {
callback(d.success === "1", "");
}
}
});
}
将处理结果的代码发送到ajaxCall
函数:
ajaxCall('https://localhost/users/add', 'post', data, 'json', function(success, err){
if (success) {
alert("Registered!");
} else {
alert(err);
}
});
相关文章:
- Gulp设置javascript对象
- 能够在指向本地环境的浏览器中设置JavaScript断点
- 设置javascript函数中文本框的值
- 没有通过ajax调用设置Javascript全局变量
- 设置Javascript倒计时计时器的初始值
- 如果为null,则设置javascript变量的值
- 如何在我用作参数的函数中设置Javascript中的本地变量
- 在 shopify 上设置JavaScript弹出窗口的样式
- 在 for 循环中设置 Javascript 变量
- 设置JavaScript变量以稍后检查定义
- 在Ruby Slim文件中设置Javascript类型
- 设置JavaScript数组
- 设置javascript对象多级属性的简单方法
- 如何正确设置 JavaScript 命名空间和类
- 在代码隐藏中从DataTable设置javascript数组
- 使用Set属性在JSP:UseBean中设置javascript变量值
- 如何设置javascript中引用的文档的URL
- MVC 5视图-设置Javascript变量
- 如何设置javascript闭包的上下文
- 设置javascript文件的版本.Java EE+Tomcat