2016-08-22 56 views
1

我在解釋回調的工作方式時遇到了一些問題。 我在寫一個必須驗證用戶輸入的函數。 在函數內部,我必須對我的API進行HTTP GET調用,以根據用戶輸入進行檢查。等到回調結束後繼續在Angular中執行

問題是驗證函數是從進程函數調用的,並且在我使用validate()進行的HTTP調用之前調用提交函數。 我無法編輯處理函數,因爲它是其他組件使用的函數。

form.process = function(){ 
    // do stuffs 
    validate(); 
    submit(); 
} 

form.validate = function() { 
    // lots of checks regarding the model 
    ... 
    // HTTP GET call 
} 

是否有可能讓submit函數等到validate()內的HTTP GET調用結束?

感謝提前:)

+0

你的'validate'函數是否返回任何'deferred'或'promise'? – Jag

+1

如果你不能編輯'process',那麼你的運氣不好。 HTTP請求總是異步的,所以'submit()'將在HTTP請求返回之前運行。 (好吧,顯然[你可以讓他們同步](http://stackoverflow.com/questions/133310/how-can-i-get-jquery-to-perform-a-synchronous-rather-than-asynchronous-ajax- ),但它會使瀏覽器掛起。) – Thomas

+0

我很困惑...爲什麼你不能編輯過程函數?它調用驗證函數,所以即使其他組件正在使用過程函數,它仍然調用驗證函數,如果這不起作用,那麼當其他組件調用它時它也不會工作... – Ted

回答

1

您必須修改驗證回到這樣一個承諾:

form.validate = function() { 
    var deferred = $q.defer(); 
    // lots of checks regarding the model 
    ... 
    // In http GET call: 
    // If success 
    deferred.resolve(<any value>); 
    // If errors 
    deferred.reject(<any value>); 
    // and now return the promise 
    return deferred.promise; 
} 

現在你可以做任何你想要在過程中的作用是這樣的:

form.process = function(){ 
    // do stuffs 
    validate().then(function(response){ 
     submit(); 
    }, function(reject){ 
     // do something like showing error. 
    }); 
} 

如果您有更多使用此功能的組件,您必須像這樣編輯所有組件。 無論如何,這是在組件的每個「驗證」功能中實現其他GET調用的最佳方式。

+0

這正是我所做的:)謝謝你的回答! –