Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 JSON流延迟一分钟?_Javascript_Json - Fatal编程技术网

如何将JavaScript JSON流延迟一分钟?

如何将JavaScript JSON流延迟一分钟?,javascript,json,Javascript,Json,我被要求编写一个java脚本程序,每分钟从websocket、地址和通过websocket检索一条api JSON记录。流在60秒后继续。我希望返回相应的流检索和来自上一次检索的流。下面是我的代码 var obj= { seconds : 60, priv : 0, prevTick : '' , data : '' } function countTime() { obj.seconds --; obj.priv ++; var ms

我被要求编写一个java脚本程序,每分钟从websocket、地址和通过websocket检索一条api JSON记录。流在60秒后继续。我希望返回相应的流检索和来自上一次检索的流。下面是我的代码

var obj= 
{
    seconds : 60,
    priv : 0,
    prevTick : '' ,
    data : ''
}

function countTime()
{
    obj.seconds --;
    obj.priv ++;
    var msg ;
    if(obj.priv > 1)
    {
        obj.priv = 0;
        obj.msg = null;
    }
    if(prop.seconds < 0)
    {
        msg = sock.open();

        obj.msg = obj.msg + ", New Tick : " + msg.msg ; 
        setTimeout(countTime, 1000);
        obj.seconds = 60;
    }

}

var sock= new WebSocket('link');


sock.onopen = function(evt) {
    ws.send(JSON.stringify({ticks:'string'}));
};

sock.onmessage = function(msg) {
   var data = JSON.parse(msg.data);
   return 'record update: %o'+ data ;

};
var obj=
{
秒:60,
priv:0,
前一行:“,
数据:“”
}
函数countTime()
{
obj.秒--;
obj.priv++;
var-msg;
如果(对象优先级>1)
{
obj.priv=0;
obj.msg=null;
}
如果(道具秒数<0)
{
msg=sock.open();
obj.msg=obj.msg+”,新勾选:“+msg.msg;
设置超时(countTime,1000);
obj.seconds=60;
}
}
var sock=新的WebSocket(“链接”);
sock.onopen=函数(evt){
send(JSON.stringify({ticks:'string'}));
};
sock.onmessage=函数(msg){
var data=JSON.parse(msg.data);
返回“记录更新:%o”+数据;
};
请问我上面的代码有什么问题?它一点也不耽搁。小溪继续向前流

试试这个:

function countTime() {
    var interval = 1000; // How long do you have to wait for next round
    // setInterval will create infinite loop if it is not asked to terminate with clearInterval
    var looper = setInterval(function () {
        // Your code here

        // Terminate the loop if required
        clearInterval(looper);
    }, interval);
}

将缓冲行为封装到类中如何

function SocketBuffer(socket, delay, ontick) {
    var messages = [], tickInterval;

    socket.onmessage = function(msg) {
        messages.push( JSON.parse(msg.data) );
    };

    function tick() {
        if (typeof ontick !== "function") return;
        ontick( messages.splice(0) );
    }

    this.pause = function () {
        tickInterval = clearInterval(tickInterval);
    };
    this.run = function () {
        if (tickInterval) return;
        tickInterval = setInterval(tick, delay * 1000);
        tick();
    };
    this.run();
}
请注意,
.splice(0)
返回数组中的所有元素,并在同一步骤中清空数组

用法:

var link = new WebSocket('link');
link.onopen = function (evt) {
    this.send( JSON.stringify({ticks:'string'}) );
};

var linkBuf = new SocketBuffer(link, 60, function (newMessages) {
    console.log(newMessages);
});

// if needed, you can:
linkBuf.pause();
linkBuf.run();

如果使用
setTimeout()
则无需手动计算秒数。此外,如果需要定期执行任务,最好使用@RyanB所说的
setInterval()
<代码>设置超时()对于只需执行一次的任务非常有用。您还使用了
prop.seconds
,但是
prop
似乎没有定义。最后,您需要在某个地方调用
countTime()
,否则它将永远不会执行

这可能会更好:

var obj= 
{
    seconds : 60,
    priv : 0,
    prevTick : '' ,
    data : ''
}

function countTime()
{
    obj.seconds --;
    obj.priv ++; //I don't understand this, it will always be set to zero 3 lines below
    var msg ;
    if(obj.priv > 1)
    {
        obj.priv = 0;
        obj.msg = null;
    }
    msg = sock.open();
    obj.msg = obj.msg + ", New Tick : " + msg.msg; 
    obj.seconds = 60;
    //Maybe you should do sock.close() here
}

var sock= new WebSocket('link');

sock.onopen = function(evt) {
    ws.send(JSON.stringify({ticks:'string'}));
};

sock.onmessage = function(msg) {
   var data = JSON.parse(msg.data);
   return 'record update: %o'+ data ;

};
var interval = setInterval(countTime, 1000);
编辑:最后,当你完成后,就去做

clearInterval(interval);

停止执行。

使用
window.setInterval(“javascript函数”,毫秒)每指定x毫秒执行一次函数谢谢您的响应,先生。您是否发现我的代码有任何问题?这是一个测试,没有太多时间。这是我知道的一点。请用代码/答案详细说明。你在调用
countTime()
本身之外的某个地方吗?@Nico先生,目前我没有。要求是,您可以看到套接字将在每次发送消息时返回流消息。我要打印消息并将流延迟到一分钟。还要打印流和它前面的流。先生,你觉得我的代码怎么样?它能满足要求吗?这是一个测试,我已经做了我所知道的一切。加上几分钟后必须提交。你在哪里调用了countTime()函数?先生只在steTimeout中调用了它。请你纠正我好吗?我应该在哪里调用它来控制延迟?好吧,在递归调用能够被setTimeout触发之前,您必须至少调用countTime一次。在定义之后立即调用:var sock=new WebSocket('link');这将是一个不错的选择。先生,如果我把
window.setInterval(countTime(),1000)
@Tomalak先生,我可以看到您有两个。在您的代码中运行。请问这两个为什么分开?一个不能替代另一个吗?不,再看看代码。有一点不同。@Tomalak您的代码确实编写得很好,而且很高级。我不明白它把previus记录和新记录一起记录在哪里。我必须将新记录与上一个记录一起记录。再次感谢你sir@tomalak先生,我们在哪里定义了tickInterval?如果我添加
tickInterval=setInterval(tick,delay),我就错了先生