4

我有一个必须调用 4 个外部 API 的集合,例如:http : //www.abc.com、http: //www.fgt.com、http : //www.jkl.comhttp ://www.rty .com _

我有一个名为 Todos.js 的集合。有没有办法我可以在一个集合中同时获取 4 个 api,因为所有四个 api 都会为我提供相同的模型响应所以我从 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用一个在短暂延迟后只返回虚拟数据的方法替换了它。

对评论的回应

将响应添加到集合中可能会更好(无论如何它更容易)。 这是一个更新的小提琴。

于 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 ”选项有点混淆,因为它说默认设置为false,也许这仅适用于 url 保持静态和单一的情况。

于 2016-11-17T16:54:47.963 回答