7

Emberのオブジェクトの優れた点の 1 つは、promiseRouteを受け入れて処理することです。modelただし、対応する API リクエストが返されたときに入力する空のレコードまたはレコードの配列とは対照的に、ルートのフックで promise を返すことの利点は何だろうと思っていました。結果は同じように見えますが、何か、つまり利点を見落としていると思います。

4

1 に答える 1

12

私はDRYの大ファンなので、少し前にAlex Matchneerが Ember に行ったRouter のフェイスリフトから記事全体の重要な段落を引用/抽出し、それを自分の言葉で説明します。Router

非同期を受け入れる...

なんで?

  • アプリで開始された遷移と URL で開始された遷移のセマンティックな違いにより、特定のケースではエラーや非同期ロジックの処理が非常に困難になりました
  • 認証ベースのアプリは特に実装が困難でした
  • redirectアプリ内/URL 遷移に応じて、Promise モデルが解決されたときに呼び出される場合と呼び出されない場合があります

解決

解決策は、非同期を採用し、ルーターの移行を第一級市民にすることでした。Transition新しい API では、さまざまなフックに渡されるオブジェクトを介して遷移の試行を防止/装飾するために必要なフックが提供されます。これらのフックは次のとおりです。

  • willTransitionトランジションが発生しようとするたびに、現在のルートで発生するイベント。
  • beforeModel/model/afterModel非同期検証フェーズ中のフック。

...

modelと友達

このルーターの反復では、transitionTo と URL の変更は同じように動作します。モデルに .then プロパティがある場合 (これは promise であることを示します)、 transitionTo を介して提供されるモデルまたはモデル フックから返されるモデルは遷移を一時停止します。

Router 残り火(リリース RC6)へのこの追加以来、私見が美しく見え、非常に理解しやすいソースに以下のようなコードが見つかります。

ソースから:

return RSVP.resolve().then(handleAbort)
                     .then(beforeModel)
                     .then(handleAbort)
                     .then(model)
                     .then(handleAbort)
                     .then(afterModel)
                     .then(handleAbort)
                     .then(proceed)
                     .then(null, handleError);

記事全体へのリンクを再度示します。

お役に立てれば。

于 2013-08-12T14:57:49.600 に答える