2017-12-07 12 views
3

私は約束を学びたいと思っています。私は、私の例題のショーのように、非同期機能を開始して停止することを思い出します。開始時に開始し、ボタンをクリックすると停止しますが、続行できないようです。停止した非同期機能を継続することはできますか?

var stop = 0; 
 
var elParrafo = document.getElementById('miParrafo'); 
 

 
function sendStop() { 
 
    stop = 1; 
 
} 
 

 
function sendStart() { 
 
    stop = 0; 
 
} 
 

 
function esperar(ms) { 
 
    return new Promise(function(resolve, reject) { 
 
    setTimeout(resolve, ms) 
 
    }); 
 
} 
 

 
async function trabajar() { 
 
    while (stop === 0) { 
 
    elParrafo.innerHTML += " > "; 
 
    await esperar(50); 
 
    } 
 
} 
 

 
trabajar();
<form class="" action="index.html" method="post"> 
 
    <input type="button" value="Stop" onclick="sendStop()"> 
 
    <input type="button" value="Start" onclick="sendStart()"> 
 
</form> 
 
<p id="miParrafo"></p>

+0

あなたのコードは約束を停止しません。それは新しいものの発射を止めるだけです。 'trabajar'を再度呼び出すことでループを停止/開始できますが、Promiseをキャンセルすることはできません。 –

答えて

3

停止/再開と一時停止の間に違いがあります。一時停止し続ける機能について説明しています。

一時停止/継続を希望する場合は、whileループを継続して実行し、内部状態を追加して、現在一時停止中かどうかを確認する必要があります。

trabajar();を再呼び出しして再起動することはできますが、再起動して続行するのは論理的に2種類あり、続行中は既存の出力をクリアしたい場合があります。

これはおそらく多くの方法がありますが、一時停止/続行と停止/再開を示す最も簡単な方法は、以下のように行うことができます。繰り返しますが、trabajar();に再度電話することは自由ですが、それはあなた次第です。

var stop = false; 
 
var pause = false; 
 
var elParrafo = document.getElementById('miParrafo'); 
 

 
function sendPause() { 
 
    pause = true; 
 
} 
 

 
function sendContinue() { 
 
    pause = false; 
 
} 
 

 
function sendStop() { 
 
    stop = true; 
 
} 
 

 
function sendRestart() { 
 
    sendStop(); 
 
    setTimeout(function() { 
 
    stop = false; 
 
    pause = false; 
 
    elParrafo.innerHTML = ""; 
 
    trabajar(); 
 
    }, 50) 
 
} 
 

 
function esperar(ms) { 
 
    return new Promise(function(resolve, reject) { 
 
    setTimeout(resolve, ms) 
 
    }); 
 
} 
 

 
async function trabajar() { 
 
    while (!stop) { 
 
    if (!pause) { 
 
     elParrafo.innerHTML += " > "; 
 
    } 
 
    await esperar(50); 
 
    } 
 
} 
 

 
trabajar();
<form class="" action="index.html" method="post"> 
 
    <input type="button" value="Pause" onclick="sendPause()"> 
 
    <input type="button" value="Continue" onclick="sendContinue()"> 
 
    <input type="button" value="Stop" onclick="sendStop()"> 
 
    <input type="button" value="Restart" onclick="sendRestart()"> 
 
</form> 
 
<p id="miParrafo"></p>

+0

ありがとうございます!それはおそらく私が本当にやりたいことです。 –

+0

「再起動」機能は必要ありませんが、私はそれについて考えていましたが、「停止」していないのに(再起動して)もう一度「再開」すると、何が問題なのか分かりませんそして、あなたがその中の "sendStop()"を消去するならば、再び。 –

+0

これはほんの一例に過ぎず、あなた自身が必要とするコードを、あなたの必要に合わせて適用することができます。約束を止めて再起動しないと、約束の新しいインスタンスが何度も追加されるため、HTMLのアップデートはより迅速かつ迅速になります。まずそれを止める必要があります。私は、約束を止めるために、この例でsetTimeoutを追加しました。繰り返しますが、これは簡単なデモ/例です。 – Nope

関連する問題