#作りたいもの
タイマーのWebアプリを作っています。ポモドーロタイマーというやつで、タイマー(25分)⇒タイマー(5分)を1セットとし、{[25分⇒5分]⇒[25分⇒5分]…}と、指定回数分、カウントダウンを繰り返します。
#できていること
「25分⇒5分」といった、動作が一度だけでいい場合の処理は、Promiseで作ることができました。
下のコードでは、テスト用に、25分のところを25秒のように変えています。
#問題点
この非同期処理を、繰り返す、という部分で躓いています。Promise処理をループすることができれば、要件を満たせると思ったのですが、うまくいきません。
非同期処理を、同期的にループする方法、あるいは、要件を満たすための別の方法などがあれば教えていただければ助かります。
よろしくお願いします。
JavaScript
1// タイマーを表示する関数です 2function startTimer() { 3 // 繰り返し回数を取得する 4 var setCount = document.getElementById('setCount').value; 5 var dt = new Date(); 6 var timeLimit = new Date(dt.getTime() + 30 * 1000); // 30秒後 7 workTimer(timeLimit).then(() => { 8 console.log('workTimerが終了'); 9 restTimer(timeLimiti).then(() => { 10 console.log('restTimerが終了'); 11 }); 12 }); 13} 14// 残り時間(ms)を文字列に変換する関数です 15function returnTimeString(ms) { 16 var min = Math.floor(ms / 60000); 17 var sec = Math.floor((ms % 60000) / 1000); 18 min = ('0' + min).slice(-2); 19 sec = ('0' + sec).slice(-2); 20 return `${min}:${sec}`; 21} 22// workTimeを計算する関数です 23function workTimer(timeLimit) { 24 return new Promise((resolve) => { 25 var timer = setInterval(() => { 26 var now = new Date(); 27 var diff = timeLimit - now; 28 if (diff <= 5 * 1000) { 29 console.log('workTimer 停止'); 30 clearInterval(timer); 31 resolve(); 32 } else { 33 var timeString = returnTimeString(diff - 5 * 1000); // restTimeを引いた値を渡す 34 console.log(`workTimer: ${timeString}`); 35 } 36 }, 100); 37 }); 38} 39// restTimeを計算する関数です 40function restTimer(timeLimit) { 41 return new Promise((resolve) => { 42 var timer = setInterval(() => { 43 var now = new Date(); 44 var diff = timeLimit - now; 45 if (diff <= 0) { 46 console.log('restTimer 停止'); 47 clearInterval(timer); 48 resolve(); 49 } else if (diff > 0) { 50 var timeString = returnTimeString(diff); 51 console.log(`restTimer: ${timeString}`); 52 } 53 }, 100); 54 }); 55}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/31 11:17