2011-10-07 57 views
18

我開發了一小部分演示軟件,其中包含幻燈片和每張幻燈片的資源。渲染幻燈片時,使用方法setTimeout延遲所有資產的循環和渲染。看起來很甜......強制setTimeout早於原始設置觸發其有效負載

Yaaay !,要求已經改變,演示文稿現在需要像PowerPoint幻燈片演示一樣,鼠標點擊事件將導致下一個資源立即呈現到頁面。

我的問題是;有沒有辦法讓我的超時立即開始?當超時被創建時,我可以獲取並在堆棧中存儲timeoutid。唯一的其他選擇是取消超時,然後重新創建元素,這是更多的處理,然後我想要做的,我不想重構我的代碼太多。

任何想法?

回答

14

簡答題是 除非您保留要解僱的方法列表,否則你不能做你所問的。然後您可以取消定時器並觸發相應的方法。

19

如果這樣設置定時器:做這個,立即

var timer1 = window.setTimeout(mainFunction,500) 

調用它:

window.clearTimeout(timer1) 
mainFunction() 

的關鍵是功能從定時器分開。

+1

便便,我想我會做到這一點,我希望速戰速決。由於'mainFunction'在第一次設置超時時計算了參數,因此我需要做一些重構來讓它們在onlick事件上......非常感謝 – lgados

+0

請參閱我的回答以下封閉包裝,避免管理更多東西。使用.cancel()和.trigger()方法替換對象的timeoutId。 – Killroy

16

你可以在這樣的封閉包裝它:

function createTimeout(timeoutHandler, delay) { 
    var timeoutId; 
    timeoutId = setTimeout(timeoutHandler, delay); 
    return { 
     clear: function() { 
      clearTimeout(timeoutId); 
     }, 
     trigger: function() { 
      clearTimeout(timeoutId); 
      return timeoutHandler(); 
     } 
    }; 
} 

var a = new Date(); 

var timeout = createTimeout(function() { console.log(a); }, 1000); 
// timeout.clear(); 
timeout.trigger(); 
+1

優雅的解決方案 – JobaDiniz