2016-08-18 14 views
0

内部からの問題は、私は別のものの内側にsetTimeout関数を持っていることです。の終了はタイムアウト

function checkBrowser() { 
    setTimeout(function() { 
    if(some.condition) //exit function checkBrowser() here 
    },5000); 
    setTimeout(/*something that mustn't run if some.condition is true*/,5000); 

} 

私はsetTimeoutを内側から最初の関数を終了する必要があります。助けて。

+0

なぜ? 'setTimeout'のコードは' checkBrowser'のコードが完了するまで決して呼び出されません。 – aghidini

+0

タイムアウトを設定する前にcall checkbrowser? – DarkBee

+0

質問を更新しました。私は2つ以上のsetTimeoutsを持っています。 some.conditionがtrueの場合、次のsetTimeoutsは実行してはいけません。 –

答えて

1

できません。コードは非同期です。

setTimeoutに渡す関数が呼び出される前に、最初の関数の実行が終了して終了します。

0

ありがとうございました!私は別の方法でそれをやった:

function checkBrowser() { 
    setTimeout(function() { 
    if(some.condition) { 
     //something here 
    } else { 
     setTimeout(/*something that mustn't run if some.condition is true*/,5000); 
    } 
    },5000); 
} 
0

あなたは、非同期/遅れのタイムラインにあなたの条件文を実行していて、そのタイムラインに入るとアウト方法はありません。あなたは、あなたのロジックがどんな再帰的な活動も含めてすべての方法でそこにとどまらなければなりません。しかし、私は約束を使用し、機能プログラミングのためにすべてのロジックをthenに移動することをお勧めします。

最初に私たちの機能を1つずつ取り上げて、すべてが約束どおりに機能する方法を見てみましょう。

OK waitAndDoStgという一般的な非同期関数があり、データとコールバックを2つの引数として取ります。私たちのコールバックが最初の型のエラーであるとしましょう。

var waitAndDoStg = (data,cb) => setTimeout(_=> cb(false, data.value),data.duration), 

これは決してエラーを返しません。したがって、data.durationミリ秒が経過すると、cb(false, data.value)のようなコールバックが呼び出され、私たちが受け取ったデータが返されます。愚かな機能はそれである。

これで、この非同期機能を約束する必要があります。私たちは、標準のpromisfyユーティリティ関数を用意しています。これは、提供される非同期関数を取り、それから約束してくれます。コールバックは、最初の型のエラーでなければなりません。私は、それぞれvx名前を使用し、代わりにresolvereject

promisfy = (data,func) => new Promise((v,x) => func(data,(err,res) => err ? x(err) : v(res))); 

OK。よく私はそれがの場合はrejectの場合は、チェックマークのように見えるので、のためにvを使用することが合理的だと思います。

ここにコードの残りの部分があります。それは約束と再帰的なものですが、機能的には非常に読みやすいコードだと思います。

var  promisfy = (data,func) => new Promise((v,x) => func(data,(err,res) => err ? x(err) : v(res))); 
 
    decrementByOne = n => --n, 
 
    waitAndDoStg = (data,cb) => setTimeout(_=> cb(false, data.value),data.duration), 
 
countDownPromise = n => {n && console.log(n); 
 
         promisfy({value:n, duration:1000}, waitAndDoStg) 
 
         .then(decrementByOne) 
 
         .then(val => val !== 0 ? countDownPromise(val) 
 
               : console.log("Ignition...!")); 
 
         }; 
 
countDownPromise(3);

関連する問題