[英]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(包裝函數),因為需要為后續調用正確傳遞參數的content
和time
。
請注意,這不會每<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.