我怎样才能让我的功能无限重复地工作

时间:2016-01-20 14:22:04

标签: javascript algorithm

这是我的伪代码

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...部分将重复运行

5 个答案:

答案 0 :(得分:1)

我认为pidanswer中的意思是你应该使用:
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(包装函数),因为需要为后续调用正确传递参数contenttime

请注意,这不会每<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);
}

此代码将循环直到数组结束,然后重新开始。

我已经在我身边进行了测试并且似乎正在工作,但是我确实重命名了这个功能,所以请根据您的要求进行调整。