4

4 つの外部 API を呼び出す必要があるコレクションがあります。例: http://www.abc.comhttp://www.fgt.comhttp://www.jkl.comhttp://www.rty .com .

Todos.js という名前のコレクションがあります。4 つの API はすべて同じモデル応答を提供するため、4 つの API を 1 つのコレクションで一緒にフェッチする方法はありますか?したがって、4 つの API から取得する応答は同じデータ構造、つまり「名前」と「リンク」を持ちます。

すべての応答を同じコレクションに追加する方法はありますか? これを達成するための最良の方法は何ですか?

4

2 に答える 2

6

fetch方法は、各 API に対して Ajax 呼び出しを行うオーバーライドすることだと思います。返された部分セットを一時配列に格納し、4 つすべてが完了したら、 を使用してコレクションを作成しますthis.reset。(JQuery を使用することもDeferred、返された呼び出しの数を内部的にカウントすることもできます。)

このようなもの:

var Collection = Backbone.Collection.extend({

    fetch: function() {
        this.completeCount = 0;
        this.errorCount = 0;
        this.temp = [];
        this.urls = [ 'url1', 'url2', 'url3', 'url4' ];
        var self = this;

        // make a $.get call for each URL and add
        _.each(this.urls, function(url) {
            $.get(url, { success: function(data) {
                console.log("Got partial collection from " + url);
                self.addPartial(data);

                // alternatively, just call "self.add(data);" here

            }, error: function(response) {
                console.log("Oops, the Ajax call failed for some reason... ignoring");
                self.completeCount ++;
                self.errorCount ++;
            } });
        });
    },

    // add a JSON array that contains a subset of the collection
    addPartial: function(data) {
        this.completeCount ++;
        var self = this;    

        // add each item to temp
        _.each(data, function(item) {
            self.temp.push(item);   
        });

        // if all have been received, then create the collection
        if (this.completeCount == this.urls.length) {
            this.reset(this.temp);
        }
    }
});

$.getこれは、少し遅れてダミーデータを返すメソッドに置き換えた Fiddleです。

コメントへの返信

応答が入って​​きたらコレクションに追加する方がおそらく良いでしょう (とにかく簡単です)。 これが更新されたフィドルです。

于 2012-12-06T21:36:27.160 に答える
1

私はそれが古い質問であることを知っていますが、誰かがここにたどり着いたら、この情報が役立つかもしれません. コレクションによって以前にフェッチされたデータを保持するには、URL を変更し、このオプションを使用して必要なときにいつでもメソッド fetch() を呼び出すことができます。

reset: false,
remove: false,

このような

yourCollection.fetch({reset: false, remove: false, [other]: [wathever]})

メソッドをオーバーライドする必要はありません。(おそらく 2012 年には必要だったのかもしれません。事実、これらのオプションは Backbone 1.1.2 以降で機能します)。これがマージされるのか、繰り返されたとしても新しいデータを追加するだけなのかはわかりません。

ドキュメント ( http://backbonejs.org/#Collection-fetch ) は、' reset ' オプションについて少し混乱しています。これは、おそらく、URL が静的で単一のままである場合にのみ適用される可能性があるためです。

于 2016-11-17T16:54:47.963 に答える