あなたは、非同期/遅れのタイムラインにあなたの条件文を実行していて、そのタイムラインに入るとアウト方法はありません。あなたは、あなたのロジックがどんな再帰的な活動も含めてすべての方法でそこにとどまらなければなりません。しかし、私は約束を使用し、機能プログラミングのためにすべてのロジックをthen
に移動することをお勧めします。
最初に私たちの機能を1つずつ取り上げて、すべてが約束どおりに機能する方法を見てみましょう。
OK waitAndDoStg
という一般的な非同期関数があり、データとコールバックを2つの引数として取ります。私たちのコールバックが最初の型のエラーであるとしましょう。
var waitAndDoStg = (data,cb) => setTimeout(_=> cb(false, data.value),data.duration),
これは決してエラーを返しません。したがって、data.duration
ミリ秒が経過すると、cb(false, data.value)
のようなコールバックが呼び出され、私たちが受け取ったデータが返されます。愚かな機能はそれである。
これで、この非同期機能を約束する必要があります。私たちは、標準のpromisfyユーティリティ関数を用意しています。これは、提供される非同期関数を取り、それから約束してくれます。コールバックは、最初の型のエラーでなければなりません。私は、それぞれv
とx
名前を使用し、代わりにresolve
とreject
の
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);
なぜ? 'setTimeout'のコードは' checkBrowser'のコードが完了するまで決して呼び出されません。 – aghidini
タイムアウトを設定する前にcall checkbrowser? – DarkBee
質問を更新しました。私は2つ以上のsetTimeoutsを持っています。 some.conditionがtrueの場合、次のsetTimeoutsは実行してはいけません。 –