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

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

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

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

jQuery

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

Chrome extension

Chrome拡張機能

Q&A

解決済

1回答

6246閲覧

setTimeoutの実行を中断させたい

red_hydrangea

総合スコア7

JavaScript

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

jQuery

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

Chrome extension

Chrome拡張機能

0グッド

0クリップ

投稿2016/10/16 11:42

###前提・実現したいこと
Chromeのアドオンで
1.画面に対してJSを実行
2.1の処理は3秒に1回行う
3.1でエラーが発生した場合は処理を中断し、エラー時用の関数を実行
という事をやろうとしています。
※実際にはもっと複雑な処理を行っているのですが
質問したい箇所とは関係ないため簡略化して書いています。

1はcontent.js、2と3はbackground.jsで行っています。

###発生している問題・エラーメッセージ
3の処理で、回数が残っていても処理を中断したいのですが、
中断されず処理が進んでしまいます。

###該当のソースコード

Javascript

1■background.js 2page_function = function(){ 3 4 error_flg = []; 5 6 for(var count = 1; count <= 5; count++){ 7 8 var timer = setTimeout(function(){ 9 10 var deferred = do_action(); 11 12 deferred.done(function(){ 13 if(error_flg[0] == true){ 14 error_action(); 15 16 return false; 17 } 18 }); 19 }.bind(null, count), count * 3000); 20 } 21} 22 23function do_action(){ 24 var deferred = new $.Deferred(); 25 26 chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 27 chrome.tabs.sendMessage(tabs[0].id, {}, function(response){ 28 29 error_flg[0] = response.error_flg 30 if(error_flg[0]){ 31 clearTimeout(timer); 32 } 33 deferred.resolve(); 34 }); 35 }); 36 37 return deferred; 38} 39 40function error_action(){ 41 chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 42 chrome.tabs.sendMessage(tabs[0].id, {}, function(response){ 43 }); 44 }); 45}

###試したこと
error_flg[0]の値がtrue(画面で実行したJSでエラーが発生)の場合、error_actionが
実行されている事は確認しています。
clearTimeout(timer)の実行をif(error_flg[0] == true)の中や
error_actionの中に変えてみても結果は変わりませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
実行環境はChrome 54.0.2840.59 mです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

deferred は不得手なので1点だけ。clearTimeout(timer);timer がスコープ内に無いので取り消せないのでは。

JavaScript

1var timers = []; 2page_function = function() { 3 /* 略 */ 4 timers.push( timer ); 5 /* 略 */ 6} 7 8 /* 略 */ 9 timers.forEach( function( timer, i ) { 10 clearTimeout( timer ); // 後の処理を全て止める 11 } ); 12 /* 略 */

投稿2016/10/16 12:30

kei344

総合スコア69364

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

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

red_hydrangea

2016/10/17 00:31

回答ありがとうございます。 do_actionに引数としてtimerを渡してみましたが変わりませんでした。 do_action内でtimerをalert出力すると値は入っていました。 引き続き宜しくお願いいたします。
kei344

2016/10/17 02:04

do_actionに引数としてtimerを渡してもすべてのtimerは止められないと思います。現在書かれている書き方だと deferred に関係なく setTimeout が実行されるので、どこかで処理を止めるなら呼び出し元のtimerを引数でもらうだけではなく、登録された全てのtimerをクリアしないといけません。 deferred と setTimeout は下記が参考になると思います。 【JavaScriptは如何にしてAsync/Awaitを獲得したのか Qiita版 - Qiita】 http://qiita.com/gaogao_9/items/5417d01b4641357900c7
red_hydrangea

2016/10/17 02:10

あ! すみません勘違いを起こしていました。 forの中でsetTimeoutを実行しているので、回す分都度timerに値が入る。 timerは配列では無い為上書きされ、最終的に5回目の値が入っている。 errorが返ってきてclearTimeoutを実行しても、5回目の値を使っているため 停止しない、という事だったんですね。 timerを配列にしif(error_flg[0])の分岐の中でtimerを回してそれぞれ clearTimeoutを行うと無事停止しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問