jquery中的未定义变量

时间:2015-10-12 05:21:04

标签: jquery ajax

通过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;
      }
    });
  }
}

4 个答案:

答案 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称为同步
  

有关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...
  }

});