如何将JavaScript JSON流延迟一分钟?
我被要求编写一个java脚本程序,每分钟从websocket、地址和通过websocket检索一条api JSON记录。流在60秒后继续。我希望返回相应的流检索和来自上一次检索的流。下面是我的代码如何将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
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),我就错了先生代码>?