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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

6回答

8698閲覧

それぞれのsetInterval処理を交互に実行したい

southern_flavor

総合スコア70

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2016/02/27 12:10

以下にふたつのsetIntervalがあります。

javascript

1//処理A 2var hoge1 = 0 3setInterval(function(){ 4$('#sample1').html(hoge1 + 1); 5hoge1 ^= 1; 6},2000); 7 8//処理B 9var hoge2 = 0 10setInterval(function(){ 11$('#samle2').html(hoge2 + 1); 12hoge2 ^= 1; 13},2000);

それぞれ、上を処理A、下を処理Bとします。
これらを、処理Aが終わったら処理Bへ移行。
その後は再び処理Aへといったようにループさせたいです。

要は同時処理を避けたくて、それぞれどちらか一方が動き、
どちらかが止まっているという状態にしたいです。

ご教授いただけましたら幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答6

0

もし処理1,処理2が非常に重く、適切な実行間隔が見積もれない状態で処理が被ることを避けたい場合は、関数の末尾から次の関数を直接呼び出したり、setTimeoutを利用する手もあるかも知れません。

javascript

1var cnt = 0; 2var fnc1 = function(){ 3 console.log('fnc1'); 4 cnt++; 5 if(cnt < 5) setTimeout(fnc2,1000); 6} 7var fnc2 = function(){ 8 console.log('fnc2'); 9 setTimeout(fnc1,1000); 10} 11fnc1();

投稿2016/02/27 13:15

hirohiro

総合スコア2068

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

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

southern_flavor

2016/02/27 16:16

ご回答ありがとうございます。 数字1、2の繰り返しだけではなく、例えば別の数字で5、6など他の数字でも動けていいですね。 また、質問内容とは別のことを言って、申し訳ないですが、数字1、2の繰り返しとは別件で、処理Aで数字1、2、3と出て 次に処理Bで数字1、2、3と出し、ループするにはどうしたらよろしいでしょうか。。
guest

0

一つのタイマーにして、フラグで処理を分けるのが手っ取り早そうです。

投稿2016/02/27 12:21

t_obara

総合スコア5488

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

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

southern_flavor

2016/02/27 16:00

ご回答ありがとうございます。 その方法も思いついたのですが、なかなかできなかったです。。
guest

0

ちょっと、長くなりますが、複数の関数を順に実行するサンプルです。

//タスクA function A(){ console.log("A"); return true; } //タスクB function B(){ console.log("B"); return true; } //タスクC function C(){ console.log("C"); return true; } //タスク登録配列 var taskArray_ = []; //実行中タスク配列番号 var nowTaskNo_ = 0; //タスク登録関数 function appendTask(cb, to){ //単に配列に、関数と、タイムアウト値を格納するだけ taskArray_.push({callback:cb, timeout:to}); } //タスク実行関数 function doTask(){ //対象タスク取得 var task = taskArray_[nowTaskNo_]; //実行中タスク番号インクリメント if(++nowTaskNo_ == taskArray_.length)nowTaskNo_ = 0; //タスク実行 if(!task.callback())return; //呼び出した関数でfalseが戻ったら終了。 //次のタスクへ setTimeout(doTask, task.timeout); // task = null; //一応メモリリーク対策、最近は書かなくても大丈夫かも? } // //実行部分 // //タスクを実際に登録 appendTask(A, 2000); //A()実行で2秒待ち appendTask(B, 1000); //B()実行で1秒待ち appendTask(C, 1500); //C()実行で1.5秒待ち //タスクを実行 doTask();

A()
B()
C()
みたいなタスク(関数)は、いくつでも増やせます。
実行したいタスク(関数)を、
appendTask(A, 2000); //関数名、タイムアウト(msec)
という形で、登録して、
doTask();
で実行開始で、延々とグルグルタスク実行します。
そのままだと終われないので、一応A()とかB()とかの関数で、falseで戻ると、doTaskを抜けるようにしてみました(このサンプルにはありませんが、)。

ご要望のものとあうかどうか?は不明ですが、これなら、関数の数などに制限されません。
prototype化したほうが格好いいですが、基本ということで。

投稿2016/02/28 03:05

ItoTomonori

総合スコア1283

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

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

southern_flavor

2016/02/29 03:57

詳細にご説明いただき、ありがとうございます。 関数化したうえに、複数にも対応できる点はすごいですね。 console.logに私が書いた var hoge1 = 0 $('#sample1').html(hoge1 + 1); hoge1 ^= 1; をいれてみたのですが、0と1しか変化がなかったのですが、これを0、1、2、0、1、2みたいにカウントアップさせるにはどこを変えたらよろしいでしょうか。
guest

0

基本

javascript

1// setIntervalで 2var hoge1 = 0; 3var hoge2 = 0; 4a(); 5 6function a() { 7 var i = setInterval(function(){ 8 clearInterval(i); 9 $('#sample1').html(hoge1 + 1); 10 hoge1 ^= 1; 11 b(); 12 },2000); 13} 14 15function b() { 16 var i = setInterval(function(){ 17 clearInterval(i); 18 $('#sample2').html(hoge2 + 1); 19 hoge2 ^= 1; 20 a(); 21 },2000); 22} 23 24// setTimeoutで 25var hoge1 = 0; 26var hoge2 = 0; 27a(); 28 29function a() { 30 setTimeout(function(){ 31 $('#sample1').html(hoge1 + 1); 32 hoge1 ^= 1; 33 b(); 34 },2000); 35} 36 37function b() { 38 setTimeout(function(){ 39 $('#sample2').html(hoge2 + 1); 40 hoge2 ^= 1; 41 a(); 42 },2000); 43} 44 45// setInterval1つで 46var hoge1 = 0; 47var hoge2 = 0; 48setInterval(a, 2000); 49 50function a() { 51 if(hoge1 == hoge2) { 52 $('#sample1').html(hoge1 + 1); 53 hoge1 ^= 1; 54 } else { 55 $('#sample2').html(hoge2 + 1); 56 hoge2 ^= 1; 57 } 58} 59 60// setTimeout1つで 61var hoge1 = 0; 62var hoge2 = 0; 63a(); 64 65function a() { 66 if(hoge1 == hoge2) { 67 $('#sample1').html(hoge1 + 1); 68 hoge1 ^= 1; 69 } else { 70 $('#sample2').html(hoge2 + 1); 71 hoge2 ^= 1; 72 } 73 setTimeout(a, 2000); 74}

投稿2016/02/27 15:03

編集2016/02/27 15:12
kagi_shippo

総合スコア105

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

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

southern_flavor

2016/02/27 16:19

ご回答についてまとめてくださってありがとうございます。 もうひとつ、つまずいてしまったことがありまして、それについて調べております。
kagi_shippo

2016/02/27 17:42

また、setInterval()とclearInterval()をセットで使うと、一見setTimeout()と同じことができているように見えますが、setInterval()とsetTimeout()は、引数に指定する間隔(時間)の意味が違うので、とくに間隔が短く処理が重い場合には、使い分けが必要です。
think49

2016/02/28 02:30

> setInterval()とsetTimeout()は、引数に指定する間隔(時間)の意味が違うので、 差し支えなければ、両者の違いを教えていただければ幸いです。 setInterval と clearInterval の組み合わせは setTimeout とほぼ同じ挙動をすると認識していました。 あえて違いをあげるなら clearInterval 前に例外エラーが発生すると延々とエラーを投げ続けますが、そういう意味でしょうか。
kagi_shippo

2016/02/29 15:18 編集

詳細な違いは、「setInterval setTimeout 違い」等で調べてください。 簡単に説明すると setInterval()は、前の処理の開始と、次の処理の開始の間隔、 setTimeout()は、前の処理の終了と、次の処理の開始の間隔の指定です。 つまり、 setInterval()に、1回に5秒かかる処理と1秒の間隔を指定すると、10回目の処理の開始は、10秒後、 setTimeout()に、1回に5秒かかる処理と1秒の間隔を指定すると、10回目の処理の開始は、55秒後になります。 また、処理にかかる時間は一定とは限らないので、 setInterval()は、一定間隔での開始が保証されるかわりに、処理が無限に重複する可能性があり、 setTimeout()は、処理が重複する可能性がないかわりに、一定間隔で開始されるとは限りません。
think49

2016/03/01 04:07 編集

なるほど、仰る事が理解できました。 ただ、一つだけ誤りがあって「setInterval()に、1回に5秒かかる処理と1秒の間隔を指定すると、10回目の処理の開始は、10秒後」は間違いで46秒後(1 + 5 * 9 === 46)でした。 setInterval と setTimeout のタイマー処理は重複しないので、「処理時間: 5秒、処理間隔: 1秒」の前提なら setInterval の2回目以降のインターバルは事実上「0」になりますね。 https://jsfiddle.net/j0uqosm7/
kagi_shippo

2016/03/02 08:32 編集

ご指摘ありがとうございます。 間違っていました。 重複しないですよね。 「つまり」からあとの部分について、以下の通り訂正させていただきます。 つまり、 setInterval()に、1回に1秒かかる処理と1秒の間隔を指定すると、10回目の処理の開始は、10秒後、 setTimeout()に、1回に1秒かかる処理と1秒の間隔を指定すると、10回目の処理の開始は、19秒後になります。 また、処理にかかる時間は一定とは限らないので、 setInterval()は、指定した間隔より処理の時間が短ければ、一定間隔での開始が保証されますが、 setTimeout()は、指定した間隔より処理の時間が短くても、一定間隔で開始されるとは限りません。
guest

0

処理A,Bをそれぞれ関数化してみてはどうでしょうか。

javascript

1function A(){ 2 console.log('A'); 3 setInterval(function(){ 4 B(); 5 },2000); 6} 7function B(){ 8 console.log('B'); 9 setInterval(function(){ 10 A(); 11 },2000); 12} 13A();

投稿2016/02/27 12:52

sekitaka_1214

総合スコア509

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

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

think49

2016/02/27 13:05

実行するとタイマーが増殖してしまいますね。 setIntervalからsetTimeoutに変更すれば期待通りに動作すると思われます。
sekitaka_1214

2016/02/27 13:22 編集

失礼しました。タイムアウトが正しいてますね
southern_flavor

2016/02/27 16:09

関数化するやり方について、setTimeoutにすれば動くようですね。 ご提案ありがとうございます。
guest

0

ベストアンサー

setInterval の第三引数を使ってはどうでしょうか(IE10- は Polyfill で)。

HTML

1<p id="sample1">sample1</p> 2<p id="sample2">sample2</p> 3<script> 4'use strict'; 5setInterval(function (parameter) { 6 var list = parameter.list, 7 i = parameter.i, 8 data = list[i]; 9 10 parameter.i = ++i % list.length; 11 console.log('#'+ data.id, jQuery('#'+ data.id)[0]); 12 jQuery('#'+ data.id).text(data.hoge + 1); 13 data.hoge ^= 1; 14}, 2000, {list: [{hoge: 0, id: 'sample1'}, {hoge: 0, id: 'sample2'}], i: 0}); 15</script>

Re: southern_flavor さん

投稿2016/02/27 12:36

think49

総合スコア18164

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

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

southern_flavor

2016/02/27 16:08

ご回答ありがとうございます。 これはいいですね。 短いコードで済みそうです。 ただ、実行結果をみると1、2といい感じに繰り返してはいるのですが、 例えば5、6の繰り返しや5、6、7の繰り返しでやろうとしたらうまく動きませんでした。
southern_flavor

2016/02/27 16:17

質問内容と別のことで申し訳ないのですが、上記のことについて、もしお分りでしたら、宜しくお願いいたします。
southern_flavor

2016/02/29 03:50

何度もありがとうございます。 こういうのもできるんですね。 実際にhtmlのページで表示確認するにはどこを変えたら良いでしょうか。
think49

2016/03/01 03:07

親記事の data.hoge ^= 1; を書き換えて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問