2016-08-22 21 views
1

コールバックの仕組みについていくつか問題があります。 私はユーザーの入力を検証する関数を書いています。 関数内で、ユーザー入力に基づいてチェックを実行するために、APIにHTTP GET呼び出しを行う必要があります。コールバックが終了するまで待ってから実行を続行します。

問題は、validate関数がprocess関数から呼び出され、submit関数が、validate()内部で行うHTTP呼び出しの前に呼び出されることです。 他のコンポーネントで使用されている関数なので、プロセス関数を編集できません。

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

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

validate()内のHTTP GET呼び出しが終了するまでサブミット機能を待機させることはできますか?事前に

感謝:)

+0

'validate'関数は' deferred'または 'promise'を返しますか? – Jag

+1

'process'を編集できない場合は、運が悪いです。 HTTPリクエストは常に非同期なので、HTTPリクエストが返る前に 'submit()'が実行されます。 (まあ、明らかに[あなたはそれらを同期させることができます](http://stackoverflow.com/questions/133310/how-can-i-get-jquery-to-perform-a-synchronous-rather-than-asynchronous-ajax-再)しかし、それはブラウザがハングアップするでしょう。) – Thomas

+0

私は混乱しています...なぜあなたはプロセス機能を編集できませんか?それはvalidate関数を呼び出しているので、たとえ他のコンポーネントがprocess関数を使用していても、まだvalidate関数を呼び出していますが、それがうまくいかない場合、他のコンポーネントが呼び出しても機能しません... – Ted

答えて

1

次のような約束を返すために検証を変更する必要があります。

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

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; 
} 

今、あなたは、このように処理機能では、あなたが欲しいものを行うことができます

この機能を使用するコンポーネントがさらに多い場合は、このようにすべてを編集する必要があります。 これは、コンポーネントの「検証」機能ごとに、他のGET呼び出しを実装する最も良い方法です。

+0

これはまさに私がやったことです:)あなたの答えをありがとう! –

関連する問題