Javascript 在淘汰应用程序中使用setInterval实现轮询?
我试图使用setInterval实现简单的轮询机制。我有一个Viewmodel,如下所示:Javascript 在淘汰应用程序中使用setInterval实现轮询?,javascript,jquery,ajax,knockout.js,Javascript,Jquery,Ajax,Knockout.js,我试图使用setInterval实现简单的轮询机制。我有一个Viewmodel,如下所示: define([ 'knockout', 'jquery', ], function ( ko, $) { function ViewModel() { var self = this; //setInterval( function() { $.ajax({url: "", async: false,timeout: 3000, succe
define([ 'knockout', 'jquery',
], function ( ko, $) {
function ViewModel() {
var self = this;
//setInterval( function() {
$.ajax({url: "", async: false,timeout: 3000, success: function (data) {
// some operation
}, dataType: "json"});
//}, 3000);
}
return ViewModel;
});
到目前为止,它工作良好,ajax调用返回数据并执行操作。如何使用setInterval使ajax调用在特定的时间间隔后返回数据,以便更新ViewModel并刷新UI中的数据?如果我取消对setInterval块的注释,那么ViewModel不会返回到DOM。我认为setInterval是异步的。欢迎提供任何解决方案。您可以尝试简单地执行以下操作:
define([ 'knockout', 'jquery',
], function ( ko, $) {
function ViewModel() {
var self = this;
var refreshInterval = /* your refresh interval in ms here*/;
setInterval( function() {
$.ajax({url: "", async: false, success: function (data) {
// some operation
timeout: refreshInterval
}, dataType: "json"});
}, refreshInterval);
}
return ViewModel;
});
ajax调用每刷新间隔一次(毫秒)。
timeout
属性是一种安全性,可以确保您在一个时间间隔内得到的答案是该时间间隔的数据,而不是以前未应答的迟到呼叫的数据。基本上,将setInterval
与异步代码一起使用不是最好的方法。最好使用setTimeout
在前一个请求完成后安排新的请求
如果您确保不能同时有两个挂起的请求,您可以通过成功处理程序中的self
访问ViewModel
实例,而不必担心旧的/其他请求会撤消更改
下面是一个例子:
函数ViewModel(){
var self=这个;
var区间=5000;
var超时=null;
var currentReq=null;
this.observedprop=ko.observeable(“空”);
var fetchNewData=函数(){
currentReq=$.ajax(/*选项*/);
当前请求
.done(processNewData)
.始终(scheduleNewDataFetch);
};
var processNewData=函数(数据){
//self引用当前的ViewModel实例
//使用self.prop(数据)设置可观察属性
自身可观察性预测(“数据”);
};
var scheduleNewDataFetch=函数(){
如果(当前请求){
currentReq.abort();
}
如果(超时){
clearTimeout(超时);
}
currentReq=null;
timeout=setTimeout(fetchNewData,INTERVAL);
};
fetchNewData();//启动更新循环
}
doesnotwork视图模型不会返回html。您能在JSFIDLE上创建一个可复制的示例吗?你的解决方案很好,但甚至定义了(['knockout','jquery',]),函数(ko,$){function ViewModel(){//your implementation}return ViewModel;});返回ViewModel是未定义的。我是否遗漏了什么?恐怕这是另一个问题,与此问题无关。试着在谷歌上搜索“amd定义返回未定义”,或者用相关的标签和代码问一个新问题。可能是循环依赖,谁知道。。。