2009-04-20 124 views
6

我有一個javascript函數,它調用一個通用函數來對服務器進行ajax調用。我需要從ajax調用的回調函數中檢索結果(true/false),但是我得到的結果總是'undefined'。提升callback onSuccess返回值給來電函數返回值

沒有所有的通用功能的超級簡化版本,我的邏輯是:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        return true; 
       else 
        return false; 
      }, 
     error: 
      function(errorThrown) { 
       return false; 
      } 
    }); 
} 

和函數調用它會是這樣的:

function Next() { 
     var result = CallServer("/Signum/TrySave"); 
     if (result == true) { 
      document.forms[0].submit(); 
     } 
    } 

的「結果」變量總是'未定義',並調試它,我可以看到回調函數的「返回true」行正在執行。

爲什麼會發生這種情況的任何想法?我怎麼可能冒泡從回調函數到CallServer函數的返回值?

感謝

回答

0

剛剛發現該怎麼做:)聲明一個變量並相應地從回調函數中更新它。之後我可以返回該變量。我把代碼爲未來的讀者:

function CallServer(urlController) { 
    var returnValue = false; 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic){ 
        returnValue = true; 
        return; 
       } 
      }, 
     error: 
      function(errorThrown) { 
       alert("Error occured: " + errorThrown); 
      } 
     }); 

     return returnValue; 
} 
+10

儘管這可能對您有用,但它是不可預測的代碼,因爲在異步POST設置其值之前,您可能會從CallServer返回「returnValue」。經驗法則:不要在同步包裝中包裝異步調用! – 2010-02-03 00:23:38

+0

你可能會考慮$ .when的方式來等待異步調用http://api.jquery.com/jQuery.when/ – Andbdrew 2012-08-28 18:28:55

0

我通常把任何代碼的回調函數本身內成功執行。我不認爲CallServer()實際上從回調本身接收到返回值。

試着這麼做:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        document.forms[0].submit(); 
       else 
        // do something else 
      }, 
     error: 
      function(errorThrown) { 
       // handle error 
      } 
    }); 
} 

編輯:我不是太熟悉的jQuery,所以我可能是完全錯誤的(我在這個基礎上的其他框架的行爲,如YUI和AJAX調用沒有任何框架)。如果是這樣,只是downvote這個答案,並留下評論,我會刪除這個答案。

+0

答案沒有錯Calvin;)問題是它是一個完全通用的函數用於驗證目的,所以我不能把代碼放在那裏,如果驗證通過了該怎麼做。我需要以某種方式使Callserver返回布爾值。乾杯 – antonioh 2009-04-20 14:41:19

15

以防萬一你想要去的異步方式(這是一個更好的解決方案,因爲在做請求時,它不會凍結您的瀏覽器),這裏是代碼:

function CallServer(urlController, callback) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: true, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       var ret = (someLogic); 
       callback(ret); 
      }, 
     error: 
      function(errorThrown) { 
       return false; 
      } 
    }); 
} 

function Next() { 
    CallServer("/Signum/TrySave", function(result) { 
     if (result == true) { 
      document.forms[0].submit(); 
     } 
    }); 
}