Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在淘汰应用程序中使用setInterval实现轮询?_Javascript_Jquery_Ajax_Knockout.js - Fatal编程技术网

Javascript 在淘汰应用程序中使用setInterval实现轮询?

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

我试图使用setInterval实现简单的轮询机制。我有一个Viewmodel,如下所示:

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定义返回未定义”,或者用相关的标签和代码问一个新问题。可能是循环依赖,谁知道。。。