2016-08-26 4 views
0

私はいくつかの機能を実行する必要がありますが、タイムアウトが切れた場合はこの機能を中止する必要があります。私はsetTimeoutとsetImmediateを使ってみました。私はこの例を書いて、作業の確認のためのコールバックでのsetIntervalを使用するが、それは私を助けてdid't:JavaScriptのタイムアウトで機能を中止する方法

function waiter(timeout, fun) { 
    var functionHandler = setImmediate(fun); 
    var timeoutHandler = setTimeout(() => { 
    console.log('stoped'); 
    clearImmediate(functionHandler); 
    clearTimeout(timeoutHandler); 
    }, timeout); 
    fun(); 
} 

waiter(5000,() => { 
    setInterval(() => { 
    console.log('work'); 
    }, 500); 
}); 

をclearImmediateした後、私の間隔がまだ働いてclearTimeout。どのように私はそのメソッドが私の機能が中止されることを保証していないことを理解した。 誰かがどのようにして機能の実行を中止するか考えていますか?

更新: はい、私はclearIntervalを呼び出す必要があることを知っていますが、これは作業確認のための単なる例です。たとえば、私はいくつかの大きなデータを解析する必要があり、それがタイムアウトで実行できない場合は、この関数の実行を取り消して別のものを呼び出す必要があります。

+0

インターバルタイマを停止するには、 'clearInterval'を呼び出す必要があります。 – Teemu

+1

コメントの質問が正しく理解されていれば、答えは「いいえ」です。タイマーの呼び出しは実行をブロックせず、終了条件が満たされるまで時間ループ機能が実行される(無限ループ、時間制限された機能が決して実行されない場合)まで、「while」ループは継続する。 – Teemu

+0

更新を見た後:長いポーリング機能を使用している場合は、タイムアウト機能を実行する前に最後まで実行されます。それで、不可能です。長いポーリング作業にWebワーカーを使用することを検討してください。 – Teemu

答えて

0

clearXXX機能は、彼らが実行を開始しませんように、彼らはただ、非同期キューから機能を削除し、現在実行中の機能を中止しないでください。 JavaScriptはコードを常に完了して実行します。メインスレッドで実行中のコードを中断することはできません。

+0

はい、私はそれを知って、ありがとう。私は私の質問を修正しました。 –

+0

私は自分の答えを修正しました。 – 4castle

+0

わかりました。どうもありがとうございました! –

0

の期間を指定し、その名前でクリアする必要があります。だから、あなたの間隔はもはや匿名ではなく、あなたはそれのための参照を持っています。

let counter = 10; 
let newYearCountdown = setInterval(() => { 
    console.log(counter); 
    counter-- 
    if (counter === 0) { 
     console.log("HAPPY NEW YEAR!!"); 
// here i clear interval by its name. 
     clearInterval(newYearCountdown); 
    } 
}, 1000); 
関連する問題