下記コードはwindowをリサイズした時にplotを再コールするコードです。
再コールする際は一旦whileをbreakさせて、breakの確認後にplot()を呼ぶようにしているつもりです。
breakを確認しているのがfbr()です。setIntervalで1ミリ秒ごとにbreakのフラグのbrが1になったかを確認しています。
brが1になったのを確認してからplot()を再コールしています。
またsetInterval動作時はリサイズされてもreturnさせています。setIntervalが複数動作しないようにするためです。
ここで質問なのですが、最初setIntervalの秒数を10にしていました。それだとwindowのリサイズ動作をやりまくるとタイミングによってsetIntervalが止まらないことがありました。それで、setIntervalの秒数を1にしたらちゃんと止まるようになりました。たまたま止まっているのでしょうか?
下記のようにwhile(true)をちゃんとbreakしてからplot()を再度呼ぶようにするもっといい方法があるでしょうか?
javascript
1 2function delay(sec) { 3 return new Promise(resolve => setTimeout(resolve, sec)); 4} 5 6let br = 0, ft = 0, move = 0; 7 8plot(); 9 10async function plot(){ 11 br = 0, ft = 0, move = 0; // 変数を全部 0 にする 12 while(true){ 13 await delay(10); 14 //何かの処理 15 if (ft) { // whileをbreakさせる 16 break; 17 } 18 //console.log("plot"); // breakしたかを確認する時 19 } 20 br = 1; // breakしたら br を 1 にする 21} 22 23window.addEventListener("resize",function(){ 24 if(move)return; // Interval動作中は return させる 25 ft = 1; 26 const id = setInterval(fbr, 1);//ここを10にするとIntervalが止まらないことがある 27 function fbr(){ 28 move = 1; // Interval動作フラグのmoveを 1 にする 29 if(br === 1){ // breakを確認する 30 clearInterval(id); //breakを確認したら Interval を解除する 31 plot(); 32 } 33 //console.log("fbr"); // Intervalが止まるかを確認する時 34 } 35})
setIntervalを10にすると、10ミリ秒未満に再びrisizeされるとsetIntervalが呼ばれて複数のIntervalが動くことになるのは解りました。
それではsetIntervalを1にしても1ミリ秒未満にrisizeが呼ばれれば同じことなのでしょうか。
他にいい方法はないでしょうか
教えてもらった参考コード。
javascript
1let resol; //JavaScrptの基礎が解ってないのですが、これをコメントアウトしても動きます。なぜでしょうか? 2plot(); 3async function plot(){ 4 let i = 0; 5 while( true ){ // 永遠と繰り返す 6 //何かの処理 7 console.log(i++);//動作を確認 8 if( await new Promise( resolve => { 9 resol = resolve 10 setTimeout( () => { resolve( false ) }, 1000 ); 11 } ) ){ break }; 12 } 13} 14 15window.addEventListener("resize",function(){ 16 resol( true ); //whileをbreak 17 plot(); 18});
回答4件
あなたの回答
tips
プレビュー