我试图让我的主干应用程序尽可能频繁地检查服务器以更新模型,类似于 twitter 的站点如何自动添加新的推文。
我当前的设置是通过他们的 api 检查外部应用程序,所以我无法访问他们的服务器,这让我不得不依赖客户端进行检查而不会太占用内存,我该如何实现呢?
我试图让我的主干应用程序尽可能频繁地检查服务器以更新模型,类似于 twitter 的站点如何自动添加新的推文。
我当前的设置是通过他们的 api 检查外部应用程序,所以我无法访问他们的服务器,这让我不得不依赖客户端进行检查而不会太占用内存,我该如何实现呢?
在 Javascript 中,你可以真正控制时间的唯一方法是通过 setTimeout/setInterval;没有“更复杂”的机制,除非您计算仅包装 setTimeout/setInterval 的辅助函数(例如“延迟”)。
所以,dmi3y 的回答是正确的。但是,由于您在标签和描述中都提到了 Backbone,所以这里有一个更类似于 Backbone 的版本......
var YourModelClass = Backbone.Model.extend({url: remoteUrl});
var instance = new YourModelClass();
var seconds = 5;
window.setInterval(_.bind(instance.fetch, instance), 1000 * seconds);
或者,如果您想将其构建到您的班级中...
var YourModelClass = Backbone.Model.extend({
url: remoteUrl,
initialize: function() {
var seconds = 5;
window.setInterval(_.bind(this.fetch, this), 1000 * seconds);
}
});
var instance = new YourModelClass();
还值得一提的是 setInterval 返回一个对象,如果您想停止“轮询”,您可以将其传递给 clearInterval。
PS 万一你不熟悉_.bind
,它来自下划线库,Backbone 依赖于它,所以你已经拥有它。它所做的只是固定this
到位,因此当您的 timeout/interval 函数解析时,this
它的内部将是第二个参数_.bind
(而不是window
,这通常是)。
可能的解决方案
(function IcallTheShoots(){
console.log('am I?'); // any way you able communicate with server
window.setTimeout(IcallTheShoots, 1500);
})();
为什么setTimeout
而不是setInterval
,因为它确保仅在当前完成时才调用下一个循环