2012-07-18 72 views
0

可能重複:
Return Value from inside of $.ajax() function

以下面的功能,例如:

function($data) { 
    $.post(
     url, 
     { 
      'data': $data 
     }, 
     function(response){ 
      return response; 
     } 
    ); 
} 

我如何才能讓家長功能:function($data) { ... }返回response

由於腳本的性質,我無法將我的其餘邏輯放入回調函數中。 (見下文)

var methods = { 

     'email' : function(field) { 
      var value = field.val(); 
      var response = false; 
      field.addClass("loading"); 
      $.post(
       ajaxData.url, 
       { 
        'action':'validate_form', 
        'value': value, 
        'method': field.data('method') 
       }, 
       function(response){ 
        return response; 
       } 
      ).complete(function() { 
       field.removeClass("loading"); 
      }); 
     }, 

     'password' : function(field) { 
      var value = field.val(); 
      var response = {}; 
      if (value.length < 8) { 
       response.result = false; 
       response.message = 'Your password must be a minimum of 8 characters'; 
      } else { 
       response.result = true; 
       response.message = false; 
      } 
      return response; 
     }, 

     'verify_password' : function(field, dependancies) { 
      var value = field.val(); 
      var response = {}; 
      if (value != dependancies["password"].val()) { 
       if (!dependancies["password"].val() || !value) { 
        return false; 
       } 
       response.result = false; 
       response.message = 'Passwords do no match'; 
      } else { 
       response.result = true; 
       response.message = false; 
      } 
      return response; 
     } 
    } 

methods每個屬性是其可被調用的函數並且return值在腳本以後使用。

var response = methods[field.data('method')](field, field.data('dependancies')); 
+2

基於異步回調編程的本質就是這樣,你沒有選擇,只能從做回調的工作。換句話說,您不能像描述它那樣獲得返回值。也許你可以在其他函數中將函數調用包裝到你的方法中,或者類似的東西。 – Pointy 2012-07-18 15:23:57

回答

2

由於AJAX一個代表Asynchronous,所以你不能返回喜歡你想要的。你可以用一個回調函數試圖象下面這樣:

function($data, callback) { 
    $.post(
     url, 
     { 
      'data': $data 
     }, 
     function(response){ 
      return callback(response); 
     } 
    ); 
} 

例如:

var myObj = { 
    myfunc: function($data, callback) { 
     $.post(
      url, 
      { 
       'data': $data 
      }, 
      function(response){ 
       return callback(response); 
      } 
     ); 
    } 
} 

myObj.myfunc($data, function(response) { 
    // process here with response 
}); 
+0

如果'method'中的所有函數都返回回調,則第二個示例可能會工作。謝謝。 – 2012-07-18 15:32:34