chrome拡張にて,chrome.alarmsを使用して,一定時間ごとに処理を行うようにしたいです.
前提・実現したいこと
popup.htmlのボタンをクリックしたタイミングで,以下のようなpopup.jsから,メッセージを送信します.
Javascript
1document.getElementById('onoff').onclick = function onoff(){ 2 chrome.runtime.sendMessage("TurnedOff", function (response){ 3 console.log(response); 4 }) 5}
以下のようなbackground.jsで,メッセージを受信したタイミングでタイマーを用意します.
Javascript
1chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){ 2 if(message=="TurnedOff"){ 3 chrome.alarms.create("off_timer", { "delayInMinutes": 1 }); 4 chrome.alarms.onAlarm.addListener(function (alarm) { 5 console.log("EndAlarm"); 6 \処理 7 }); 8 } 9})
これにより,popup.htmlのボタンをおすごとに,1分間のタイマーが開始し,1分経過後にコンソールに"EndAlarm"と表示されることを期待していました.
発生している問題
検証したところ,バックグラウンドページを更新してから,最初の1回目は,想定通り,1分後にコンソールに"EndAlarm"と表示されました.
しかし,それ以降,ボタンを押した回数"EndAlarm"が重複して表示されてしまいます.バックグラウンドページを更新してから3回目にボタンを押した場合,"EndAlarm"が3回表示されます.ボタンを押せば押すほどに,"EndAlarm"が重複して表示されてしまいます.
"EndAlarm"の表示を常に1度だけにしたいです.
試したこと
ボタンをクリックするたびに新しいタイマーが作成されるが,以前作成したものが残っているため,処理が重複してしまうのでは,と思い,background.jsにchrome.alarms.clearAll要素を追加してみましたが,状況は変わりませんでした.
Javascript
1chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){ 2 if(message=="TurnedOff"){ 3 chrome.alarms.create("off_timer", { "delayInMinutes": 1 }); 4 chrome.alarms.onAlarm.addListener(function (alarm) { 5 console.log("EndAlarm"); 6 \処理 7 }); 8 chrome.alarms.clearAll(function(wasCleared){ \追加 9 console.log(wasCleared); 10 }); 11 } 12})
あなたの回答
tips
プレビュー