backbone js - 减少对服务器的调用

时间:2015-01-03 14:40:13

标签: javascript backbone.js

只是想知道人们如何处理停止多个外部服务器调用?我在fetch的.complete中做了所有事情,因为当我尝试调用任何东西时,fetch还没有完成,并且集合中没有任何内容。

我是骨干的新手,所以我可能错过了一个技巧..但是有没有办法进行获取并将信息存储在某个地方,这样你就再也不用取,你只需要工作作为变量的集合?我所有的信息都来自外部网站,所以如果可以的话,我不想做很多不必要的外部电话。我没有更新服务器或任何东西,它只是只读。

其他人为类似的设置做了什么?我错过了一些傻事吗?或者我为此设置得很糟糕?这是我到目前为止所做的工作(正在进行中)

哦,还有:我在路由器上进行提取..这是一个坏主意吗?

http://jsfiddle.net/leapin_leprechaun/b8y6L0rf/

.complete(
    //after the fetch has been completed
    function(){
        //create the initial buttons
        //pull the unique leagues out
        var uniqueLeagues = _.uniq(matches.pluck("league"));

        //pull the unique leagues out   
        var uniqueDates = _.uniq(matches.pluck("matchDate"));

        //pass to info to the relative functions to create buttons   
        getLeagues(uniqueLeagues);
        getMatchDates(uniqueDates);
        homeBtn();
        fetched = true;
    }
); //end complete

谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

这是一个经常反复出现的问题,但答案很简单 如果有帮助,也许今天我会做一些图纸 我从来没有花时间正确地学习UML,所以请原谅我。

<强> 1。问题

你现在拥有的是:

enter image description here

但问题是这不是很有活力 如果右边的这三个函数需要从不同的ajax回调函数执行,则需要将它们添加到任何这些回调中。
想象一下,您想要更改这3个函数中的任何一个的名称,这意味着您的代码会立即中断,并且您需要更新每个回调。

您的问题表明您认为您希望避免每个函数分别执行异步调用,这确实是这种情况,因为这会产生不必要的开销。

<强> 2。事件汇总

解决方案是实现事件驱动的方法,其工作原理如下:

enter image description here

此模式也称为pub / sub(或观察者模式),因为有些对象发布事件(在本例中为左侧)和订阅的对象(右侧)。
使用此模式,您无需在ajax回调完成后显式调用每个函数;相反,对象订阅某些事件,并在事件被触发时执行方法。这样,您始终可以确定将执行这些方法 请注意,触发事件时,也可以传递参数,这允许您从订阅对象访问集合。

第3。骨干实施

Backbone推动事件驱动的方法 设置事件聚合器很简单,可以按如下方式完成:

window.APP = {};
APP.vent = _.extend({}, Backbone.Events);

从ajax回调中,你只是触发一个事件(你给它任意名称,但按照惯例,半冒号用作分隔符):

APP.vent.trigger("some:event", collection);  

三个接收对象按如下方式订阅事件:

APP.vent.on("some:event", function(collection){ 
    console.log(collection.toJSON()); 
}); 

这基本上都是。
要考虑的一件事是确保当您使用“on”订阅事件时,如果您不再需要该对象,还需要通过调用“off”取消订阅。

答案 1 :(得分:1)

如何处理这一切由Backbone.js决定,但这里有一个你可以选择的选项

创建一个以body为主体并处理所有内容的视图。(我通常使用Coffee,因此可能会出现语法错误)

$( document ).ready(function() {
  mainView = new MainView({el: "body"});
});

MainView = Backbone.View.extend({
  initialize : function(){
    this.prepareCollection();
  },
  prepareCollection : function(collection){
    _checker = function(){
      if (collection.length === _done) {
        this.render();
      }
    };
    _.bind(_checker,this);
    collection.each(function(item){
      item.fetch(
        success : function(){
          //you can also initialize router here.
          _checker();
        }
      );
    });
  },
  rener : function(){
    //make instance of View whichever you want and you can use colleciton just like variable
  }
})
相关问题