1

私はバックボーン アプリケーションに取り組んでおり、複雑さが増しています。副作用の 1 つは、ページの初期ロードが遅い場合があることです。この問題は、AJAX リクエストの待機にまで遡ります。

私の現在のルートのいくつかでは、4 つの別々のリクエストのようなものを作成しています。テンプレートの読み込みなど、重要なものもあります。したがって、jQuery ajax リクエストの done() 関数を使用して、ページの読み込みを継続するコールバックを渡します。

重要でない小さな要素のデータが必要な場合があります。たとえば、最新の 5 つのブログ投稿を読み込むリクエストです。今、私の考えでは、ルートの残りの実行を停止することなく、できるだけ早くリクエストを行いたい、準備ができたら知りたい、ということでした。

だからここに私の提案があります

var myModel = new Posts(); //instantiate the model
myModel.dfd = myModel.fetch();

その後、最後の投稿要素を処理するサブビューで、渡されたモデルを取得するメソッドがあり、このようなことを行います

render : function() {
  var self = this;
  this.model.dfd.done(function( ) {
    this.html( template( self.model.toJSON() );
  }
} 

アイデアは、リクエストがすでに終了している場合はすぐに実行され、そうでない場合は待機するというものです。しかし、少なくとも私は、この時点までの時間節約の恩恵を受けています。

これは良い考えですか?

4

2 に答える 2

2

私は promise と deferred が好きです。それらは素晴らしいと思いますが、ここではそれらを使用する場所ではないと思います。代わりに、モデルがまだ入力されていない場合でも、UI のデフォルト バージョンをレンダリングできるテンプレートを用意します。したがって、サーバーからモデルのデータをまだ取得しているかどうかに関係なく、ビューは常にまったく同じことを行います。

そのため、サーバーからブログ エントリを取得するのに数分の 1 秒かかるため、ブログ エントリが表示されない可能性があります (テンプレートと、単純に {} を返す model.toJSON() 呼び出しの結果です)。次に、モデルにデータが入力され、その「変更」イベントが発生すると (モデルの変更イベントをリッスンし、発生時にレンダリングするビューがあると想定しています)、自動的に更新されます。

Backbone.js で最も優雅で自然な方法だと思います。これにより、コードがクリーンなままになり、操作を試行および順序付けするために特別なコーディングに頼ることなく、ビューおよびモデルの仕上げ操作の順序付けが処理されます。

この配置がより優雅になると私が思う唯一のことは、モデルの「リクエスト」イベントもリッスンし、「同期」イベントが発生するまでエンドユーザーにある種のビジーインジケーターを表示することです。その後、ユーザーは UI の更新を最初に確認するだけでなく、最終的なデータがまだ取得されていない場合、リクエストが保留中であるために待機する必要があることを認識します。

于 2013-01-03T22:04:52.223 に答える
0

それは完全に機能し、$.Deferredsを利用する良い例です...しかし、あなたが考えることができる別の方法もあります:最初にリクエストを同期させるだけです。

Fetchはそのオプションをに渡し$.ajax$.ajaxリクエストが同期か非同期かを制御する「async」引数を取ります。これは、次の場合を意味します。

self.model.fetch({async: false});
// self.model will already be fetched by the time this next line runs
this.html( template( self.model.toJSON());

どちらの方法でも、私見はうまくいきます。どのスタイルが好みの問題です。

PS後者のスタイルに関するマイナーな注意点の1つは、$。Deferredと組み合わせようとすると問題が発生する可能性があることです。jQueryサイトから:

jQuery 1.8以降、jqXHR($ .Deferred)でのasync:falseの使用は非推奨になりました。complete / success/errorコールバックを使用する必要があります。

于 2013-01-03T18:08:16.273 に答える