3

バックボーン JQuery モバイル サンプル アプリ http://jquerymobile.com/test/docs/pages/backbone-require.htmlのコードをチェックしていました。

コレクションオブジェクト内に次のものが見つかりました

// Backbone.sync メソッドをオーバーライドします (Backbone.fetch メソッドは、データを取得しようとするときに sync メソッドを呼び出します)
sync: function( メソッド、モデル、オプション ) {

            // ローカル変数
            // ===============

            // 空の配列をインスタンス化します
            var カテゴリ = [],

                // this コンテキストを self 変数に格納します
                自分=これ、

                // jQuery Deferred オブジェクトを作成します
                deferred = $.Deferred();

            // setTimeout を使用して、非同期でデータを取得する実際のアプリケーションを模倣します
            setTimeout( 関数() {

                // 上記のサンプル JSON データをフィルタリングして、正しいカテゴリ タイプのみの配列を返します
                カテゴリ = _.filter( self.jsonArray, function( 行 ) {

                    row.category === self.type を返します。

                } );

                // options.success メソッドを呼び出し、オブジェクトの配列を渡します (これらのオブジェクトをモデルとして現在のコレクションに内部的に保存します)
                options.success(カテゴリ);

                // カスタムの `added` メソッドをトリガーします (カテゴリ ビューがリッスンします)
                self.trigger( "追加" );

                // 遅延オブジェクトを解決します (これにより、カテゴリ ルーター内の changePage メソッドがトリガーされます)
                deferred.resolve();

            }、1000);

            // 遅延オブジェクトを返します
            延期されたリターン;

        }

deferred が宣言されて返される部分を理解したいのですが、なぜそれが必要なのですか? コールバックは関連付けられていません。また、setTimeout を使用して遅延オブジェクトを内部で解決する理由もよくわかりません。

4

3 に答える 3

2

遅延オブジェクトは、非同期メソッドを管理するためのものです。ネストされたコールバック ブロックを混乱させることなく、成功/エラー コールバックを設定するのに役立ちます。また、複数の非同期操作が完了するまで待機する必要があるシナリオの処理にも最適です。Deferred は JQuery AJAX メソッドとは別のものですが、JQuery AJAX メソッドによって実装されています。

Backbone でこれを使用する方法の 1 つの例として、サーバーから JSON データと HTML テンプレートの両方をロードする必要がある場合を考えてみましょう。ビューをレンダリングする前に、2 つの非同期呼び出しを完了する必要がある場合があります。whenDeferred を使用すると、複数の promise オブジェクトを に渡すことができ、すべてが完了すると呼び出されるため、これを処理するのに便利です。

deferred に関する情報については、JQuery サイトのドキュメントを調べる価値があります。


(そして、そこのコードにはコールバックが表示されていませんが、たとえば から成功/エラー コールバックをアタッチすることは可能Backbone.Model.fetchです。)

于 2012-11-15T05:32:55.593 に答える
1

コードを読んでください:)

// Uses a setTimeout to mimic a real world application that retrieves data asynchronously

遅延オブジェクトは、作成時にコールバックをアタッチする必要はありません。それがオブジェクトの要点です。あなたはそれらを読むべきです。

于 2012-11-15T05:28:14.697 に答える
0

拡張性のために、これを使用する場合、この実装を変更することなく、Deferred オブジェクトにハンドラーを関連付けることができます。

setTimeout は純粋に「見せて伝える」ものであり、ある種のサービス呼び出しを模倣しています。したがって、次のように消費できます。

var myDeferred = myCollection.sync();
myDeferred.error(function() {
     /* error handling */
})
.done(function() { /* clean up state */ });
于 2012-11-15T05:31:52.493 に答える