棘手的范围问题?

时间:2013-06-09 17:05:44

标签: javascript jquery

非常简单,但它不会按预期方式运作。

$(function(){   
  (function(){  
     /**
      * @return boolean Depending on success
      */
     function saveOnServer(data){            
         var result = false;            
         $.ajax({                 
             url : "/post/write.ajax",
             data : data, 
             success : function(response){                      
                  if (response == "1"){                           
                      alert('Response is 1. OK');                          
                      result = true;
                  }
             }
         });             
         return result;
     }                  

     $("#save").click(function(e){              
          e.preventDefault();               
          // This inserts some stuff (on the server), but always returns FALSE
          if ( saveOnServer($("form").serialize())) ){                  
              alert('1'); // This expected to be alerted              
          } else {                 
              alert('0'); // <- But... This will be alerted
          }
     });
  })($);
});

问题是response var始终返回1,并且它也会警告Response is 1. OK。但...

result始终为FALSE。为什么?

3 个答案:

答案 0 :(得分:3)

在此请求完成之前,您无法返回异步请求的结果。

您必须做的是在成功回调中使用结果:

 function saveOnServer(data, dowith){
     $.ajax({
         url : "/post/write.ajax",
         data : data, 
         success : function(response){
              doWith(response == "1")
         }, error : function() {
              doWith(false)
         }
     });
 }

 $("#save").click(function(e){
      e.preventDefault(); 
      // This inserts some stuff (on the server), but always returns FALSE
      saveOnServer($("form").serialize()), function(result){
         if (result) {
            alert('1'); // This expected to be alerted
         } else {
            alert('0'); // <- But... This will be alerted
         } 
      });
 });

答案 1 :(得分:1)

if ( saveOnServer($("form").serialize())) ){

您正在测试saveOnServer()函数的返回结果。它立即返回值false,它不等待ajax调用完成。

答案 2 :(得分:1)

与大多数AJAX问题一样,似乎与AJAX有异步,这意味着你希望函数返回一个值,但是ajax请求还没有返回。 尝试添加async:false以确保这是问题所在。

$.ajax({                 
             url : "/post/write.ajax",
             data : data,
             async:false,
             success : function(response){                      
                  if (response == "1"){                           
                      alert('Response is 1. OK');                          
                      result = true;
                  }
             }
         });             

如果是这样,你应该考虑以在成功函数内部进行功能的方式重做代码。