バックグラウンドでも動く setInterval

このQ&Aのポイント
  • バックグラウンドでも動く setIntervalのサンプルコードを探していたところ、superInterval.jsというコードを見つけました。
  • しかし、その書き方や使い方が分かりにくく、どのような処理をしているのか理解できません。
  • 特に、'=>' という部分や、 '() => cb(...args)' という記述が意味不明です。
回答を見る
  • ベストアンサー

バックグラウンドでも動く setInterval

https://gist.github.com/kawaz/72f61d8389fed0e9d4e7dc9eb01b39c8 setIntervalはブラウザのタブがバックグラウンドで動作しないとのことで動作させるためのサンプルコードが ないかと調べていたところ上記サイトを見つけました。 ただ、その書きっぷりも訳が分らない & 何をやっているのかわからないです。 当方が昔、見たことのあるJavaScriptとはまるで違っていて「そんな書き方あったっけ?」 という感じです。 例えばsuperInterval.jsの下記の部分に出てくる '=>' というのが謎でそれぞれ何を意味しているのでしょうか? とくに3つ目の 「() => cb(...args)」なんていうのが???です const superInterval = (cb, interval=1000, ...args) => { const code = `self.addEventListener('message', msg=>{setInterval(()=>self.postMessage(null), msg.data)})` w.onmessage = () => cb(...args) (superInterval.js) const superInterval = (cb, interval=1000, ...args) => { try { const code = `self.addEventListener('message', msg=>{setInterval(()=>self.postMessage(null), msg.data)})` const w = new Worker(`data:text/javascript;base64,${btoa(code)}`) w.onmessage = () => cb(...args) w.postMessage(interval) return {stop:()=>w.terminate()} } catch(_){ // 実装の問題またはCSPによる拒否などで Worker が使えなければ普通の setInterval を使う const id = setInterval(cb, interval, ...args) return {stop:()=>clearInterval(id)} } } (使い方) { const log = (...args) => console.log(...args) const {stop} = superInterval(log, 500, 1, {a:2}, [3]) setTimeout(stop, 3000) }

質問者が選んだベストアンサー

  • ベストアンサー
  • retorofan
  • ベストアンサー率33% (328/975)
回答No.1

Q. '=>' というのが謎でそれぞれ何を意味しているのでしょうか? A. アロー関数の記述方法です。 アロー関数式では function も記述しない代わりに 関数のブロックの前に => を記述します。

unko347
質問者

お礼

ありがとうございます。アロー関数という記法なのですね。 ちなみに、superInterval.jsの内容は何をやっているのかわかりますでしょうか? const code = `self.addEventListener('message', msg=>{setInterval(()=>self.postMessage(null), msg.data)})` の部分がよくわからないのです。 setIntervalの第一引数に関数定義「()=>self.postMessage(null)」を渡し、第二引数にmsg.data を渡しています。 これはmessageイベントが発生したらsetIntervalで定期的にpostMessageでWorkerにメッセージ(msg.data)を送信する ということなのでしょうか? そしてその処理をWorkerに渡して処理をバックグラウンドで動かすということをやっているのでしょうか?

関連するQ&A

  • 再投稿_バックグラウンドで setInterval

    すみません、誤って同様の質問を締め切ってしまったので再投稿させていただきます。 https://gist.github.com/kawaz/72f61d8389fed0e9d4e7dc9eb01b39c8 setIntervalはブラウザのタブがバックグラウンドで動作しないとのことで動作させるためのサンプルコードが ないかと調べていたところ上記サイトを見つけました。 上記サイトでは下記のようなコードが記述されていたのですやっていることがわからなかったのですが どなたか解説して頂けないでしょうか。 大きく下記2点が不明です。 1. const code = `self.addEventListener('message', msg=>{setInterval(()=>self.postMessage(null), msg.data)})` の部分 setIntervalの第一引数に関数定義「()=>self.postMessage(null)」を渡し、第二引数にmsg.data を渡しています。 これはmessageイベントが発生したらsetIntervalで定期的にpostMessageでWorkerにメッセージ(msg.data)を送信する ということなのでしょうか? そしてその処理をWorkerに渡して処理をバックグラウンドで動かすということをやっているのでしょうか? そもそも'message'イベント(メッセージを受信?どこから?)っていつ起こるものなのでしょうか。 2. superIntervalに渡している引数 (使い方)にあるsuperInterval()に渡している引数がよくわからないです。  第二引数で500を渡していながらsuperIntervalの第二引数はinterval=1000となってるし、 その他の引数についても何のためにどういう使い方をしているかわかりますでしょうか? (superInterval.js) const superInterval = (cb, interval=1000, ...args) => { try { const code = `self.addEventListener('message', msg=>{setInterval(()=>self.postMessage(null), msg.data)})` const w = new Worker(`data:text/javascript;base64,${btoa(code)}`) w.onmessage = () => cb(...args) w.postMessage(interval) return {stop:()=>w.terminate()} } catch(_){ // 実装の問題またはCSPによる拒否などで Worker が使えなければ普通の setInterval を使う const id = setInterval(cb, interval, ...args) return {stop:()=>clearInterval(id)} } } (使い方) { const log = (...args) => console.log(...args) const {stop} = superInterval(log, 500, 1, {a:2}, [3]) setTimeout(stop, 3000) }

  • 他の関数内にあるsetinertvalを参照できな

    clearInterval(timer0);が他の関数内にあるsetinertvalを参照できない。 エラーになってしまいます。 let startSlot = (()=> { let timer0 = setInterval(() => { 内容 }, interval); })(); // stopSlot let stopSlot = (()=> { const stop0 = document.getElementById('stop0'); const stop1 = document.getElementById('stop1'); stop0.addEventListener('click', ()=> { clearInterval(timer0); }); })(); 勝手にカプセル化してしまう スコープの問題に非常に悩むのですがどう対処しますか? よい回答を頂けないので、いろいろな所で聞いています。

  • 他の関数内にあるsetinertvalを参照できな

    clearInterval(timer0);が他の関数内にあるsetinertvalを参照できない。 エラーになってしまいます。 let startSlot = (()=> { let timer0 = setInterval(() => { 内容 }, interval); })(); // stopSlot let stopSlot = (()=> { const stop0 = document.getElementById('stop0'); const stop1 = document.getElementById('stop1'); stop0.addEventListener('click', ()=> { clearInterval(timer0); }); })(); 勝手にカプセル化してしまう スコープの問題に非常に悩むのですがどう対処しますか? let iterative = { setTimeout(myChange , 5000); // } とした場合ちゃんと止まっていますのでスライドショーに問題はないです 停止は上記でできるがこれですと名前のある関数にできないので再度動かすことができないのです。 var playBtn = document.getElementById('js-play-btn'); playBtn.addEventListener('click', function () { _iterative(); }); が変数に代入しただけではできないですよね – よい回答を頂けないので、いろいろな所で聞いています。

  • 画像がフェードイン・アウトするクラスの作り方教えて..

    前置き:別に困っているわけでもありません ・こんな質問許されないかも(ご容赦を) ・自分で勉強しろと言われるかも(ごもっとも) ・ごみプログラムがさらにごみプログラムを生んでいるかも(ごめんなさい) 本題: いつぞやのタイトルくるくるのサンプルを基に、画像がフェードイン、 フェードアウトするオブジェクト指向っぽいスクリプトを作りました。 下のソースです。スタイル属性の変更をwindow.setIntervalを使って counter値に達するまでループ実行しているだけです。 似たような処理のfadeinクラスとfadeoutクラスを作って、  fadein.start(ターゲット,インターバルミリ秒);  fadeout.start(ターゲット,インターバルミリ秒); でフェードイン、フェードアウトを開始していますが、 fadeinクラスとfadeoutクラスをfadeinoutクラス一つにまとめちゃって、 fadeinoutクラスのメソッド(?)としてfadein、fadeoutを使えるように するには、どうやって作ればよいのかと言うのが質問です。 本当は、  var myobj = new fadeinout(ターゲット,インターバルミリ秒); とインスタンスして  myobj.fadein;  myobj.fadeout; みたく使うためのコーディングがよくわからんのです。 抜本的に書き換えた方がよいのでしょうか... <作ったサンプル> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>FadeIn/FadeOut</title> <style type="text/css"></style> <script type="text/javascript" charset="utf-8"> <!-- var fadein = function (node,interval){ this.counter = 0; this.target = node; this.interval = interval; this.timerId = setInterval((function(that){ return function(){that.loop();}; })(this),this.interval); this.stop = function () { this.timerId && clearInterval(this.timerId); this.timerId = null; }; this.loop = function(){ this.target.style.width=this.counter+"px"; this.target.style.height=this.counter+"px"; this.target.style.opacity = this.counter / 100; this.target.style.filter = "alpha(opacity=" + this.counter + ")"; if( ++this.counter>100) this.stop(); }; }; var fadeout = function (node,interval){ this.counter = 100; this.target = node; this.interval = interval; this.timerId = setInterval((function(that){ return function(){that.loop();}; })(this),this.interval); this.stop = function () { this.timerId && clearInterval(this.timerId); this.timerId = null; }; this.loop = function(){ this.target.style.width=this.counter+"px"; this.target.style.height=this.counter+"px"; this.target.style.opacity = this.counter / 100; this.target.style.filter = "alpha(opacity=" + this.counter + ")"; if( --this.counter<0) this.stop(); }; }; fadein.start = function(target,interval){ new fadein(target,interval ); } fadeout.start = function(target,interval){ new fadeout(target,interval ); } function fadein_s(){ var target=document.getElementById("target"); fadein.start(target,1); } function fadeout_s(){ var target=document.getElementById("target"); fadeout.start(target,1); } // --> </script> </head> <body> <div> <image id="target" src="image/yahagi.png" style="width:0px;height:0px;"> </div> <button onclick="fadein_s();">フェードイン</button> <button onclick="fadeout_s();">フェードアウト</button> </body> </html>

  • setIntervalについて

    お世話になります <script type="text/javascript"><!-- window.onload=function() { n=0; Timer = setInterval("ch()",1000); } function ch() { n++; document.getElementById("test").innerHTML = n; } function re() { clearInterval(Timer); } function call() { Timer = setInterval("ch()",1000); } //--></script> <input type="button" onclick="re()" value="reset"> <input type="button" onclick="call()" value="call"> <div id="test"></div> としたときにページを表示したら1秒ごとに<div>『test』に1ずつ数が増えて表示されていき『reset』ボタンを押すとTimerが止まり『call』ボタンを押すとTimerが再開します でもTimerを解除せずに『call』ボタンを押すと1秒に2ずつ、3ずつという風に相乗されていきます(新しいTimerが追加されていく) これをTimerが起動しているときに『call』ボタンを押すとreturn false; 起動していないときにはTimerを起動させるという風にすることは可能でしょうか? (Timerが起動しているときに『call』ボタンを押せないようにする以外に)

  • fedoraでyum updateに失敗する

    fedora9にて, sudo yum update を実行すると以下のようなエラーがでて,updateできません. -------------------------------------------------------------------------- Running rpm_check_debug ERROR with rpm_check_debug vs depsolve: Traceback (most recent call last): File "/usr/bin/yum", line 29, in <module> yummain.user_main(sys.argv[1:], exit_code=True) File "/usr/share/yum-cli/yummain.py", line 229, in user_main errcode = main(args) File "/usr/share/yum-cli/yummain.py", line 181, in main return_code = base.doTransaction() File "/usr/share/yum-cli/cli.py", line 409, in doTransaction print to_utf8(msg) File "/usr/lib/python2.5/codecs.py", line 303, in write data, consumed = self.encode(object, self.errors) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 20: ordinal not in range(128) ------------------------------------------------------------------------- pythonを消して入れ直してたいのですが,依存関係でyumなどが消えてしまうためできません. どうしたらよいのでしょうか?

  • 【jQuery】setInterval

    jqueryの初心者です。 3つの画像を3秒間隔でクロスフェードさせ、それを繰り返したいのですが setIntervalの使い方が違うのか、思うような動きになりません。 何が原因なのかと、無駄な部分があると思いますので なるべくシンプルで初心者レベルのコードを教えて頂きたいです。 宜しくお願いします。 $(function(){ setInterval(function(){ setTimeout(function(){ $(".photo-1").fadeOut(1000); },3000); setTimeout(function(){ $(".photo-2").fadeIn(1000); },3000); setTimeout(function(){ $(".photo-2").fadeOut(1000); },6000); setTimeout(function(){ $(".photo-3").fadeIn(1000); },6000); setTimeout(function(){ $(".photo-3").fadeOut(1000); },9000); setTimeout(function(){ $(".photo-1").fadeIn(1000); },9000); },3000); }); <div id="photo-box"> <p class="photo-1"><img src="img/01.jpg" width="500" height="150" alt="" /></p> <p class="photo-2"><img src="img/02.jpg" width="500" height="150" alt="" /></p> <p class="photo-3"><img src="img/03.jpg" width="500" height="150" alt="" /></p> </div>

  • 最適なsetInterval()の秒数について

    setIntervalを使い、一定時間マウス操作がない場合に location.hrefでログアウトする処理を行っていますが 1秒毎にチェックするより、5秒毎の方が軽いでしょうか? 又、1秒で指定した場合、画面描画に1秒以上かかる場合 動作がおかしくなったりするのでしょうか?

  • JavascriptでsetInterval()

    JavascriptでsetInterval()を指定時間後に実行したいのですが、方法が分かりません。 Javascriptは別ファイルになっています。 <div id=header_ko> <img src="data/ball.gif" name="ball" style="position:relative;left:100px;top:15px;" onclick="setInterval('moveBall()',25)"> </div> //ボールを右に少しずつ動かします。 //JSファイルは外部にあり、呼び出します x=100; y=1; function moveBall() { if(x<775){ x+=y; document.ball.style.left=x; } } //xが774のところまで、行ったら、ボールの動きが止まります。 ボールが止まってもプログラムは動いていると聞いて、 setInterval()を使用して、プログラムの上でも停止させたいのですが、 方法が分かりません。 Javascript初心者です。 宜しくお願いいたします。

  • jQuery 2つのsetInterval

    写真と文字を組み合わせたクロスフェードで行き詰りました。 2つ質問があります。 【質問1】 1番目のテキストがフェードイン→3秒待機→1番目のテキストと 1番目の写真がフェードアウト→2番目・3番目同じ→繰り返し。 という感じにしたいのですが、下記の#text-boxの設定ですと setIntervalで5秒間隔でフェードインになるので#photo-boxとの タイミングが5秒ずれてしまいます。 これを合わせるにはどうすればよいのでしょうか? 【質問2】 下記のように、1つのdivでテキストと写真を入れると正常に動かなくなります。 それぞれ分けてdiv(#text-box,#photo-box)で囲うと動きます。 この原因はなんでしょうか? <div id="all-box"> <p class="text">1番目のテキスト</p> <p class="photo"><img src="img/01.jpg" width="500" height="200" alt="" /></p> <p class="text">2番目のテキスト</p> <p class="photo"><img src="img/02.jpg" width="500" height="200" alt="" /></p> <p class="text">3番目のテキスト</p> <p class="photo"><img src="img/03.jpg" width="500" height="200" alt="" /></p> </div> 宜しくお願いします。 $(function(){ $("#text-box .text").hide(); setInterval(function(){ $("#text-box") .find(".text:first-child") .fadeIn(1000) .delay(3000) .fadeOut(1000) .next(".text") .end() .appendTo("#text-box"); },5000); $("#photo-box .photo:gt(0)").hide(); setInterval(function(){ $("#photo-box") .find(".photo:first-child") .fadeOut(1000) .next(".photo") .fadeIn(1000) .end() .appendTo("#photo-box"); },5000); }); ■HTML <div id="all-box"> <div id="text-box"> <p class="text">1番目のテキスト</p> <p class="text">2番目のテキスト</p> <p class="text">3番目のテキスト</p> </div> <div id="photo-box"> <p class="photo"><img src="img/01.jpg" width="500" height="200" alt="" /></p> <p class="photo"><img src="img/02.jpg" width="500" height="200" alt="" /></p> <p class="photo"><img src="img/03.jpg" width="500" height="200" alt="" /></p> </div> </div> ■CSS #all-box{ position:relative; width:500px; height:200px; } #text-box,#photo-box{ width:500px; height:200px; } #text-box .text{ position:absolute; top:80px; left:0; z-index:2; } #photo-box .photo{ position:absolute; top:0; left:0; width:500px; height:200px; z-index:1; }

専門家に質問してみよう