这是我的伪代码
var list = {
a:[
{content: 'a', time: 5},
{content: 'b', time:2},
{content: 'c', time:3}]
}
var insert_and_stop = function(content, time){
//let content insert to somewhere and wait for "time" second
}
我的要求是在数据集(列表)上运行insertSome(内容,时间)循环
然后重新开始到列表的头部
显然,我可以使用for
在列表上运行我的功能
但我不知道如何重新开始?
我现在的解决方案是:
for(var i = 0; i<list.a.length; i++){
(function(i){
setTimeout(insert(list.a[i].content), list.a[i].time * 1000);
})(i);
}
它有效,但如果我让while(true)
包含此代码,我就不会这样做
浏览器将崩溃,因为for...
部分将重复运行
答案 0 :(得分:1)
我认为pid
在answer中的意思是你应该使用:
setInterval(function, delay)
其中function
是函数名称,delay
是调用之间的延迟(以毫秒为单位)。
答案 1 :(得分:0)
使用setInterval(<function-name>, <delay-in-milliseconds>)
<function-name>
是函数名称或lambda(如果你知道这是什么),<delay-in-milliseconds>
是延迟调用之间的毫秒。
否则,如果您确实需要在insert_and_stop()
内执行此操作,则可以执行以下操作。写一个实际的函数(这意味着你只需 1个退出点)。然后,在退出函数之前:
setTimeout(function () { insert_and_stop(content, time); }, time);
您需要lambda(包装函数),因为需要为后续调用正确传递参数content
和time
。
请注意,这不会每<time>
毫秒调用一次函数,因为函数本身的执行时间不计算在内。如果insert_and_stop()
花费的时间与<time>
类似,则此效果可能会变得合理。否则,如果函数快速(微秒)并且间隔很长(100或1000倍),则根据您实际执行的操作,开销可能可以忽略不计。
答案 2 :(得分:0)
此处的两个选项是setInterval(function, delay)
和setTimeout(function, delay)
。主要区别在于,setInterval
将恰好触发每个delay
时间段,而setTimeout
只会在内部代码运行时触发。在实践中,如果代码运行的时间超过了您的预期,则必须注意副作用(这会导致setInterval
多次将代码堆叠在自身之上。)
示例:
function myTimeoutFunc(){
// .. some code
setTimeout(myFunc, delay-in-milliseconds);
}
myFunc();
function myIntervalFunc(){
// .. some code
}
setInterval(myIntervalFunc, delay-in-milliseconds);
答案 3 :(得分:0)
//set my function each 3seconds
var interval = setInterval("myFunction", 3000);
//or
var interval = setInterval(function(){
alert("I am myFunction");
}, 3000);
//release
releaseInterval(interval);
这很重要&#34; setInterval&#34;需要释放的返回值!
答案 4 :(得分:0)
使用您的代码作为参考和您的查询,以下是我将如何处理它:
var list = {
a:[
{content: 'a', time: 5},
{content: 'b', time:2},
{content: 'c', time:3}]
}
var i = 0;
var insertContent = function(){
// Do something with the content
console.log(list.a[i].content);
// Either increment the i or restart at 0.
if((list.a.length - 1) > i ){
i++;
}else{
i = 0;
}
setTimeout(function(){
// Run the function again
insertContent();
}, list.a[i].time * 1000);
}
此代码将循环直到数组结束,然后重新开始。
我已经在我身边进行了测试并且似乎正在工作,但是我确实重命名了这个功能,所以请根据您的要求进行调整。