質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

1312閲覧

forとsetTimeoutを合わせてsleepさせたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/03/26 23:15

前提・実現したいこと

forとsetTimeoutを合わせてsleep入れる形を考えているのですが、
sleepになっておらず、またxの数値も加算されていきません
このコードの問題点をご指摘いただけないでしょうか

また、9999回のループ中に処理中断ボタンを押したらループを抜け、
処理を止めれる形にしたいです

該当のソースコード

JavaScript

1<script> 2var timerID; 3var f=0; 4function timer(){ 5clearTimeout(timerID); 6text.innerHTML+=x+"<br>"; 7} 8window.onload=function(){ 9for(i=0;i<9999;i++){ 10x=i; 11if(f==1){ 12break; 13alert("中断"); 14clearTimeout(timerID); 15} 16timerID=setTimeout("timer()",1000); 17} 18} 19</script>

該当のソースコード

HTML

1<input type="button" value="処理中断" onclick="f=1"> 2<font id="text"></font>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2020/03/26 23:29

そもそも何故JavaScriptにはsleepが無くて変わりにsetTimeoutが与えられているか考えた事はありますか?
退会済みユーザー

退会済みユーザー

2020/03/26 23:35

あなたのしたいことはできません
退会済みユーザー

退会済みユーザー

2020/03/26 23:36

初めからこう書けばいいのでしょうが、私のコードのおかしな部分がききたかったのですが、、、 forとsetTimeoutを合わせたsleepを作りたかったのですが、、、 <script> var timerID; var f=0; var i=0; function timer(){ if(i<=9999){ text.innerHTML+=i+"<br>"; i++; } if(f==1){ clearTimeout(timerID); text.innerHTML="中断"; } timerID=setTimeout("timer()",1000); } </script> <input type="button" value="処理開始" onclick="timer()"> <input type="button" value="処理中断" onclick="f=1"> <font id="text"></font>
退会済みユーザー

退会済みユーザー

2020/03/26 23:40

「無理です」と言われてもなぜ私の最初のコードでsleepにならないんでしょうか それが聞きたいんですが、、、
退会済みユーザー

退会済みユーザー

2020/03/27 00:14

スリープという機能はないからです
退会済みユーザー

退会済みユーザー

2020/03/27 00:21

setTimeout 発行したプロセスが終了後にnミリ秒後に引数に指定した処理を一度だけ実行する。 setInterval 発行したプロセス終了後に指定したnミリ秒毎に引数に指定した処理を繰り返し実行する
退会済みユーザー

退会済みユーザー

2020/03/27 00:24

本来の要求と思われるならばforは使いませんが、forを使う制限が含まれているので回答にサンプルコードの記述はしません。他にも制限があるようなので以下同文
guest

回答4

0

このコードの問題点をご指摘いただけないでしょうか

普通に実行したブラウザJavaScriptはシングルスレッドなので、forでループを回している途中には、ほかのコードは一切実行されません。つまり、そのままでは「9999回のループ中に処理中断ボタンを押したらループを抜け、処理を止めれる形にしたいです」ということは実現できません

代替策としては、

  • すでに出ているようにsetTimeoutなどで処理を切り分ける
  • forループ内でasync-awaitを使って、見た目上はforループを回しつつ中身は非同期実行にする
  • (ループ内で行う処理が計算・通信だけで、DOMを書き換える必要がないなら)ServiceWorkerに切り出して、別スレッド実行を行う

などが考えられます。

投稿2020/03/27 00:08

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/03/27 00:10

setTimeoutも「実行予定に登録する」だけなので、ループがまわり続けている間には一切実行されません。
guest

0

ベストアンサー

こんな感じの処理になります。

投稿2020/03/27 00:30

yambejp

総合スコア116734

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/03/27 00:33 編集

async/await/promiseを使用します
退会済みユーザー

退会済みユーザー

2020/03/28 10:31

yambejp様 asyncが対応しているブラウザかどうかの判定はどうすればいいのでしょうか?
guest

0

古典が入りますが、setTimeout() だけで実装する例
CODEPEN setTimeout()でゲームループ

投稿2020/03/27 05:01

AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

forでなく最初からsetIntervalを使えばいいというのは無しでお願いいたします

投稿2020/03/26 23:19

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/03/27 00:12

なぜ「無し」なのでしょうか。それでは実現できないなにかがあるのでしたら、その詳細をお知らせください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問