簡體   English   中英

我如何讓我的功能無限地重復工作

[英]how can I let my function work repeatedly infinitely

這是我的偽代碼

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
}

我的要求是運行循環以在數據集(列表)上插入一些(內容,時間)
然后重新開始到列表的開頭
很明顯,我可以使用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...部分將重復運行

我認為pid在他的回答中要表達的意思是您應該使用:
setInterval(function, delay)
其中function是函數名稱,而delay是兩次調用之間的延遲(以毫秒為單位)。

使用setInterval(<function-name>, <delay-in-milliseconds>) ,其中<function-name>函數名稱或lambda(如果您知道這是什么),而<delay-in-milliseconds>延遲兩次調用之間的毫秒數

否則,如果您實際上需要在insert_and_stop()內部執行insert_and_stop()操作,則可以執行以下操作。 編寫一個實際函數 (這意味着您僅需要1個出口點 )。 然后,在退出功能之前:

setTimeout(function () { insert_and_stop(content, time); }, time);

您需要使用lambda(包裝函數),因為需要為后續調用正確傳遞參數的contenttime

請注意,這不會每<time>毫秒調用一次函數,因為沒有考慮函數本身的執行時間。 如果insert_and_stop()花費的時間與<time>相似,則此效果可能會變得明智。 否則,如果功能快速(微秒)並且間隔很大(長100或1000倍),則根據實際操作,開銷可以忽略不計。

這里的兩個選項是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);
//set my function each 3seconds
var interval = setInterval("myFunction", 3000);
//or
var interval = setInterval(function(){
    alert("I am myFunction");
}, 3000);

//release
releaseInterval(interval);

需要釋放的重要“ setInterval”返回值!

使用您的代碼作為參考和查詢,這是我的處理方法:

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);
}

該代碼將循環直到數組末尾,然后再次開始。

我已經對它進行了測試,並且似乎可以正常工作,但是我確實重命名了該功能,因此只需根據您的要求進行調整即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM