2013-04-15 86 views
1

我已经在互联网上搜索了几天,以找到在backbone.js中拥有实时收藏的优化解决方案。想到一个虚拟的房间(例如聊天室),我想显示谁在那个房间里。现在我每2秒获取一次集合,并向列表视图中添加新用户(在我的例子中为玩家),并且它正在工作,但我担心流量以及所有无用的ajax请求都不会返回任何内容。如何在backbone.js中轮询集合时防止无用的ajax请求?

这里是我的支柱脚本:

App.players = new App.Collections.Players; 
waitingUserList = new App.Views.WaitingPlayers({ collection: App.players }); 

setInterval(function() { 
    App.players.fetch({ 
     success: function(collection) { 
      collection.each(function(player) { 
       if (player.get('added') == 0) { 
        player.set('added', 1); 
        player.save(); 
       } 
      }); 
     }, 
    }); 
}, 2000); 

$('div.waiting-list').append(waitingUserList.el); 

和我的PHP代码(我使用laravel 3):

public function get_index($gid) 
{ 
    $players = Game::find($gid)->players()->get(); 
    if (!empty($players)) { 
     return Response::eloquent($players); 
    } else { 
     return false; 
    } 
} 

有什么办法,当叫collection.fetch(),它等到一些新的记录添加到数据库中,然后服务器响应ajax请求。

P.S.我不想用html5 websockets
P.S.S.这是我的第一个骨干的经验,所以请原谅我,如果我一直在某处错误的或说一些愚蠢的事情:d

在此先感谢

+5

您不必使用网络套接字。像socket.io和signalR这样的库处理插座不可用时丢弃到xhr longpolling。 –

+1

http://forums.laravel.io/viewtopic.php?id=5717 –

+1

@CoryDanielson感谢您的链接 – Behzadsh

回答

1

你在做什么叫做轮询。正如你已经提到的那样,它不能很好地扩展。你应该寻找像彗星一样的解决方案。这一切都取决于你的后端。例如Apache在这方面做得并不好(Using comet with PHP?)。

取决于您的需求,但我会建议node.js和socked.io实现web套接字和旧版浏览器的后备。如果您想与您的主要Web服务器上的现有代码使用代理进行交互。

+1

我发现棘轮(http://socketo.me),它似乎是我所需要的,我读这些教程对我来说太复杂了,所以我认为最好使用node.js和socket.io,因为它像前面提到的那样具有旧版浏览器的后备功能。谢谢您的回答 – Behzadsh