Javascript 在主干js中使用同一集合从不同URL获取数据

Javascript 在主干js中使用同一集合从不同URL获取数据,javascript,jquery,backbone.js,backbone-model,backbone.js-collections,Javascript,Jquery,Backbone.js,Backbone Model,Backbone.js Collections,我有一个集合,它必须调用4个外部API,例如:,和 我有一个名为Todos.js的集合。有没有一种方法可以在一个集合中同时获取4个API,因为所有4个API都会提供相同的模型响应 因此,我从4个API得到的响应具有相同的数据结构,即“名称”和“链接” 有没有一种方法可以将所有响应附加到同一个集合中?实现这一目标的最佳方式是什么 我认为方法是重写fetch,在这里对每个API进行Ajax调用。将返回的部分集存储在临时数组中,当所有4个都完成后,使用this.reset创建集合。(我想,您可以使用J

我有一个集合,它必须调用4个外部API,例如:,和

我有一个名为Todos.js的集合。有没有一种方法可以在一个集合中同时获取4个API,因为所有4个API都会提供相同的模型响应 因此,我从4个API得到的响应具有相同的数据结构,即“名称”和“链接”


有没有一种方法可以将所有响应附加到同一个集合中?实现这一目标的最佳方式是什么

我认为方法是重写
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
,该方法在短时间延迟后仅返回虚拟数据

评论回复


在收到响应时将其添加到集合中可能会更好(无论如何,这会更容易)

我知道这是个老问题,但如果有人到这里来,这些信息可能会有所帮助。 要保留集合先前获取的数据,您可以随时更改url并使用以下选项调用方法fetch():

reset: false,
remove: false,
像这样

yourCollection.fetch({reset: false, remove: false, [other]: [wathever]})
仅此而已,无需重写该方法。(也许在2012年是必要的,不知道。事实是这些选项适用于主干网1.1.2或更高版本)。请注意,我不确定这是否会合并或只是添加新数据,即使它是重复的


文档()对“重置”选项有点混淆,因为它表示默认情况下已结算false,可能只有当url保持静态和单一时,这才适用。

我现在面临的问题是,一次抓取成功,我更新了url并再次抓取,但结果它更新了我的整个集合。但是有一种方法,我们可以直接将模型添加到集合中。我们是否可以继续将其添加到集合中每一次常规的抓取都是一样的吗?@KishanThobhani是的,绝对是。您可以使用
collection.add(data)
其中data是数组。这取决于您希望事件触发的方式——我上面的方法将触发一个
重置
事件,您的建议将触发4个
添加
事件。谢谢,但我遇到了一个不同的问题,我尝试过这样做,但一切都有问题。你能看看这个@KishanThobhani吗?这就是为什么你必须重写
fetch
函数的原因。默认的
fetch
方法将始终清除并重新创建集合。好的,让我试试。谢谢