2011-10-07 3 views
18

私は各スライドのスライドとアセットからなるプレゼンテーションソフトウェアを少し開発しました。スライドがレンダリングされると、すべてのアセットがループスルーされ、setTimeoutメソッドを使用して遅延後にレンダリングされます。甘く見えます...最初に設定したよりもペイロードを早く発生させるためにsetTimeoutを強制する

Yaaay !,要件が変更されました。プレゼンテーションはPowerPointスライドショーのように動作する必要があります。マウスクリックイベントにより、次のアセットがすぐにページに表示されます。

私の質問は、私のタイムアウトをすぐに発火させる方法はありますか?タイムアウトが作成されたときにタイムアウトが返されるので、タイムアウトIDを取得してスタックに格納できます。他の唯一のオプションは、タイムアウトをキャンセルしてから、要素を再作成することです。これは処理したいと思っています。コードをリファクタリングする気にはなりません。

アイデア?

答えて

14

短い答えはいいえ 解雇するメソッドのリストを保持していない限り、求めていることはできません。その後、タイマーをキャンセルして、対応するメソッドをトリガすることができます。

19

あなたは、このようにタイマーを設定した場合:

var timer1 = window.setTimeout(mainFunction,500) 

は、これを行うことで、すぐにそれを呼び出す:

window.clearTimeout(timer1) 
mainFunction() 

キーはタイマーから機能を分離することです。

+1

うんちを、私は簡単な修正を期待していた、私はこれをしなければならないと考えました。 'mainFunction'には、タイムアウトが最初に設定されたときに計算される引数があるため、onlickイベントでそれらを取得するためにリファクタリングを行う必要があります...ありがとうございました – lgados

+0

より多くのものを管理しなくて済むクロージャラッピングについては、 。 timeoutIdを.cancel()メソッドと.trigger()メソッドで置き換えます。 – 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

関連する問題