2016-09-20 13 views
0

例:私はウェブサイトの「新しいアカウントを作成する」ページにいます。アカウントを作成する前に、私は指定された電子メールが迷惑メール(つまり、[email protected])かどうかを判断する必要があります。2つの約束をトリガし、条件付きで1つを待つ方法

function emailIsValid(): JQueryPromise<boolean> { ... } 
function getPotentialDuplicates(): JQueryPromise<IDupResults> { ... } 

:私はまた、代わりに新しいもの(多分アドレスがすでに存在している、など)これらはように定義されているのに使用されなければならない可能アカウントのリストを返すバック、アカウントがすでに存在するかどうかを決定する必要があります仮説的に、getPotentialDuplicatesコールでは、超低速の実際に古いデータベースをチェックして、完了までに3〜5秒かかりますが、emailIsValidは通常4秒かかります。したがって、私は、この結果は、このアクションツリーによって定義されていると同時に、これらの呼び出しの両方をキックオフしたいと思います:

  • の場合 - 最初getPotentialDuplicatesリターン:
    • 待ちemailIsValidのためならば
    • を返すために、 - 電子メールは有効です。
      1. 場合 - 何DUPのが発見されていない、そうで
      2. アカウントを作成する - ユーザーにショーDUPの。エルス
    • - まずemailIsValidリターン - エルス
  • dupResultsを無視し、 "メールが無効です" と表示さ: - 電子メールが有効な場合
    • を:getPotentialDuplicates
    • ため
      1. 待ち
      2. ダブが見つからない場合、アカウントの作成
      3. Else - ユーザーにダップを表示します。
      エルス
    • からgetPotentialDuplicates待つと、「メールが無効である」表示しない

現在、私はwhen.doneを使用していますが、これは仕上げの両方を待ちます。これを定義する簡単な方法はありますか?

+0

これを行うことができるネイティブなPromiseやjQueryの実装には何かがあるかどうかはわかりません。ブルーバード・プロミス・ライブラリーには、あなたが望むように思える「Promise.any'」(http://bluebirdjs.com/docs/api/promise.any.html)があります。 –

+0

@MikeMcCaughanはPromiseの標準API定義のネイティブPromise実装ですか、それとも特定のライブラリですか? – Daryl

+0

最近のバージョンのブラウザではPromiseオブジェクトがネイティブに実装され、[Promise/A +標準](https://promisesaplus.com/)に準拠しています。もちろん、同じ標準を実装しているライブラリと、[Q](https:// github。com/kriskowal/q)と前述の[bluebird](http://bluebirdjs.com/docs/getting-started.html)を参照してください。 1.5でのjQueryの実装は、「CommonJS Promises/A標準(http://wiki.commonjs.org/wiki/Promises/A)」に基づいています。 [jQuery](https://api.jquery.com/jQuery.Deferred/)を参照してください。 –

答えて

3

どちらの場合でも、emailIsValidを待つ必要があります。したがって、

// kick off both 
const emailIsValidProm = emailIsValid(); 
const getPotentialDuplicatesProm = getPotentialDuplicates(); 

emailIsValidProm.then((res)=> { 
    if (res.invalid) { // if res in valid 
     return; 
    } 
    else { 
     // now wait for the other 
     return getPotentialDuplicatesProm 
    } 
}) 
.then(res=> { 
    if (!res) return; // email wasn't valid; 
    // The res is for `getPotentialDuplicatesProm 
    // USE it ! 
}) 

PS:Jqueryの約束を使用せず、標準のPromise APIを使用することを強くお勧めします。 https://basarat.gitbooks.io/typescript/content/docs/promise.html

+0

私は "standard Promise api"と仮定していますが、標準を実装しているライブラリを意味していますか?もしそうなら、TypeScriptを扱う際にはどのライブラリをお勧めしますか?私は既にJQueryを持っていて、何か新しいことをもたらす必要がないので、私はJQueryを使用しています。 JQuery(すべてのjsライブラリの一見、王)が推奨されない理由を説明する何かに私を誘導できますか? – Daryl

+0

Jqueryの約束が悪い:https://gist.github.com/domenic/3889970 約束事について:https://github.com/stefanpenner/es6-promise – basarat

+0

私はこの会話までPolyfillingが何をしているのか分からなかった。驚くばかり! es6-promiseライブラリを使用します! – Daryl

関連する問題