私たちが使用して2つの同時無限ループを開始した場合worker('hello')
やworker('world')
、どのように我々は、後にループの1つを停止することができますか?
例えば:
const sleep = async function (duration) {
await new Promise(r => setTimeout(r, duration));
}
const worker = async (id) => {
while (true) {
console.log(id);
await sleep(2000); // simulates a blocking call
}
}
(async () => {
const hello = worker('hello')
const world = worker('world')
// Let's assume that now a user-input requires us to stop the `worker('hello')`
setTimeout(() => {
console.log('stopping hello...')\
// how to stop 'hello'?
}, 5000)
})();
worker()
関数の外部からこれらのループを停止することはできません。Javascriptにはその機能がありません。
それらに影響を与えることができるようにするには、それらのループがループの外側にあるもの(変数または関数の呼び出しなど)をチェックする必要があります。
外の世界から影響を受ける可能性のあるループを作成する方法は他にもたくさんあります。
いくつかの例:
setInterval()
関数から間隔timerIDを使用して返します。次に、呼び出しclearInterval()
てループを停止できます。
ループが1つのメソッドである小さなオブジェクトを作成し、そのループで、外部から変更できるインスタンス変数をテストします。
PSPromise
拒否を強制するコンストラクターに置き換えるハックがいくつかある可能性があります。これにより、await
がスローさasync
れ、次のサイクルで関数が含まれて拒否されますが、そのレベルのハックと侵入を探しているわけではないと思います。環境。
拒否される代わりにハッキングすることはできないsleep()
と宣言されconst
ているので。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加