2016-11-15 12 views
2

クローム拡張インストール/アップデートイベントについて質問があります。バックグラウンドスクリプトのトップレベルコードにonInstalledイベントリスナーを追加すると、イベントリスナーがそのイベントを捕捉する時間枠がありますか?クロム拡張onInstalledイベント

私のデモでは、onInstalledリスナーをフックする前に実行するロジックがあると、その間にイベントが発生したように実行されないように見えるので、これを尋ねています。

誰かが、このイベントがどのように機能するか、バックグラウンドスクリプトの他のロジックのコンテキストで、私が何か有用なものを見つけることができなかったため、いくつかのドキュメントを指摘してくれます。

ありがとうございます!

更新@Noamハッカーは:により、会社の方針に私はここに任意の実際のコードを投稿することはできませんが、私は私の問題を説明するいくつかの擬似コードを持っている:

/** 
* setup in which I miss onInstalled event 
*/ 
function firstLogicThatRunsOnBackgroundLoad() { 
    // perform some logic 

    // perform some asynchronous operations via generators and promises 
    // which can take a while 

    chrome.runtime.onInstalled.addListener(function (details) { 
      if (details.reason == "install") { 
       // this logic never gets executed 
      } else if(details.reason == "update") { 
       // perform some logic 
      } 
     }); 
} 

/** 
* setup in which I catch onInstalled event 
*/ 
function firstLogicThatRunsOnBackgroundLoad() { 
    chrome.runtime.onInstalled.addListener(function (details) { 
      if (details.reason == "install") { 
       // this logic executes 
      } else if(details.reason == "update") { 
       // perform some logic 
      } 
     }); 

    // perform some logic 

    // perform some asynchronous operations via generators and promises 
    // which can take a while 
} 
+0

背景スクリプトのサンプルコードはありますか? –

+0

リスナー関数の内部にプライマリロジックを置くとどうなりますか? 'chrome.runtime.onInstalled.addListener(function(details){ //最初にやりたいロジックを実行... //インストール/更新ロジック... }' –

+0

@NoamHackerもし私が私がリスナー関数の中で最初に実行したいロジックで、私のテストでは、バックグラウンドに他のロジックがある場合、このロジックが最初に実行されるという保証はないことが示されました。 – slickman

答えて

2

onInstalledリスナーは、これらの状況でイベントをキャッチ:

拡張機能が初めてインストールされたとき、拡張機能が新しいバージョンに更新されたとき、およびChromeが新しいバージョンに更新されたとき。

これはすべて非同期であるため、バックグラウンドで発生し、ドキュメントに従って、これらの状況ですぐに発生します。これを明確にするために、非同期プログラミングを見直してください。

link to documentation

あなたの質問によると、あなたが正しい順序でコードを実行して助けたいように思えます。 This answerは、あなたのケースに役立つフレームワークを提供しています(reason属性を使用)。

chrome.runtime.onInstalled.addListener(function(details){ 
    if(details.reason == "install"){ 
     //call a function to handle a first install 
    }else if(details.reason == "update"){ 
     //call a function to handle an update 
    } 
}); 
+1

これは、拡張機能のインストール、更新、またはChromeが新しいバージョンに更新されたときにonInstalledイベントが発生することを認識しています。私は、私がonInstalledリスナーをフックする前に実行されていたロジックがあると、リスナーがそのイベントを捕らえることはないことに気がついたので、私はそのフローとそのイベントを捕らえることができる時間枠についてより多くの面倒を見ました。 – slickman

2

私もこれを理解する必要がありました。私は権威あるものは見つけられませんでしたが、console.time()の文を私のバックグラウンドスクリプトに投げました。

console.time('onInstall event'); 
console.time('first function'); 

chrome.runtime.onInstalled.addListener(details => { 
    console.timeEnd('onInstall event'); 
}); 

// 7 module imports 

someSyncFunction() // console.timeEnd('first function') is called in the first line in this function 

その後、私はちょうど(DEVモードでは、展開)拡張を数回再ロード/ロード:

コードは次のようなものでした。 onInstallは最初の関数が最初のmsで起きている間、最初の50ms内でかなり確実に起動しているようです。結果は次のとおりです。

(First function, onInstall event) 
(.282ms, 47.2ms) 
(.331ms, 45.3ms) 
(.327ms, 49.1ms) 
(.294ms, 45.9ms) 
関連する問題