-1

非常に簡単ですが、本来の方法では機能しません。

$(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
          }
     });
  })($);
});

問題は、responsevar が常に を返し1、アラートResponse is 1. OKも出すことです。しかし...

resultは常にFALSE。なんで?

4

3 に答える 3

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
         } 
      });
 });
于 2013-06-09T17:09:33.450 に答える
1
if ( saveOnServer($("form").serialize())) ){

関数 saveOnServer() から返される結果をテストしています。これはすぐに値を返しますfalse。ajax 呼び出しが完了するのを待ちません。

于 2013-06-09T17:09:06.273 に答える
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;
                  }
             }
         });             

これがそうである場合は、成功関数内で機能が作成されるようにコードをやり直すことを検討する必要があります。

于 2013-06-09T17:13:18.500 に答える