以下にふたつの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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア2068
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
総合スコア1283
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/29 03:57
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総合スコア105
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/27 16:19
2016/02/27 17:42
2016/02/28 02:30
2016/02/29 15:18 編集
2016/03/01 04:07 編集
2016/03/02 08:32 編集
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
総合スコア509
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/27 13:05
2016/02/27 13:22 編集
2016/02/27 16:09
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
総合スコア18164
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/27 16:08
2016/02/27 16:17
2016/02/27 18:25 編集
2016/02/29 03:50
2016/03/01 03:07
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/27 16:16