通过ajax调用我正在更新某些内容并返回false和true。但问题是,在我从更新函数获得结果值之前,执行update
函数后出现的if条件,因此它给出了错误的未定义结果和错误的errMsg变量。如果我再次编写此代码,那么它可以工作。如果条件直到我的更新函数返回某个值,我怎么能停止运行?
var result = update(field_name, field_value);
if (result == false) {
alert(errMsg);
} else {
alert(errMsg);
}
更新功能
function update(field_name, field_value) {
if (field_value) {
$.post("/restapi/vc/users/id/${user.id}/profiles/name/" + field_name + "/set?value=" + field_value, function(data, status) {
var xmlDoc = data;
var x = xmlDoc.getElementsByTagName("response")[0];
var txt = x.getAttribute("status");
if (txt == 'error') {
var msg = xmlDoc.getElementsByTagName("message")[0];
var errMsg = msg.childNodes[0];
window.errMsg = errMsg.nodeValue;
return false;
} else {
return true;
}
});
}
}
答案 0 :(得分:0)
因为update函数返回void / null。和null是==到false。
var result = update(field_name,field_value);
//update method is called and returns null
if(result == false){ //null == false is true
alert(errMsg); //this line will execute
}else{
alert(errMsg);
}
由于JavaScript的异步特性,这种情况正在发生。 window.errMsg在被警告后被设置。 update方法中的ajasx post是ajax请求,其sucess方法称为async。
使用Deffered的更好方法是使用回调。
var update = function update(field_name, field_value, callback) {
if (field_value) {
$.post(
"/restapi/vc/users/id/${user.id}/profiles/name/" + field_name + "/set?value=" + field_value,
function(data, status) {
var xmlDoc = data;
var x = xmlDoc.getElementsByTagName("response")[0];
var txt = x.getAttribute("status");
if (txt == 'error') {
var msg = xmlDoc.getElementsByTagName("message")[0];
var errMsg = msg.childNodes[0];
//its not good practice to add
//transactional messages to window/global scope
//window.errMsg = errMsg.nodeValue;
//return false;
//instead of return call the callback
callback(errMsg.nodeValue);
} else {
//return true;
//likewise in case of success
callback();
}
}
);
}
};
//and call update method like this -
update(field_name, field_value, function(errMsg){
if (errMsg) {
alert(errMsg); //alert the error message
} else {
alert('success');
}
});
答案 1 :(得分:0)
在ajax调用
之后,有两种方法可以调用更新函数1)响应ajax调用
调用更新函数 2)通过在ajax调用中设置async:false
有关ajax调用同步的更多信息的链接将在这里 How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?
答案 2 :(得分:0)
这里的问题是你的if条件是在ajax请求完成之前执行的。 Ajax以异步方式工作,这意味着它在后台进程中执行,而主要的javascript执行并不等待它最终完成进展。
errMsg
永远不会从ajax回调中获取值,因为它最有可能在ajax完成之前执行
您只需在帖子回调函数中提醒消息:
function update(field_name, field_value){
if(field_value){
$.post("/restapi/vc/users/id/${user.id}/profiles/name/"+field_name+"/set?value="+field_value, function(data, status){
var xmlDoc = data;
var x = xmlDoc.getElementsByTagName("response")[0];
var txt = x.getAttribute("status");
if(txt == 'error'){
var msg = xmlDoc.getElementsByTagName("message")[0];
var errMsg = msg.childNodes[0];
alert(errMsg); // alert the message here
} else{
return true;
}
});
}
}
答案 3 :(得分:0)
您可以像这样使用$.Deferred
:
function update(field_name, field_value){
var defObj = $.Deferred();
if(field_value){
$.post("/restapi/vc/users/id/${user.id}/profiles/name/"+field_name+"/set?value="+field_value, function(data, status){
defObj.resolve(data);
});
}
return defObj.promise();
}
您可以在此处获取data
属性
var result = update(ield_name,field_value);
$.when(result).done(function(data){
// ....you will get the `txt` here..
// ... so move your above code here..
var xmlDoc = data;
var x = xmlDoc.getElementsByTagName("response")[0];
var txt = x.getAttribute("status");
if(txt == 'error'){
var msg = xmlDoc.getElementsByTagName("message")[0];
var errMsg = msg.childNodes[0];
window.errMsg = errMsg.nodeValue;
// other code goes here...
}
});