ホームページ  >  記事  >  ウェブフロントエンド  >  呼び出し後に「chrome.tabs.query」の結果が利用できないように見えるのはなぜですか?

呼び出し後に「chrome.tabs.query」の結果が利用できないように見えるのはなぜですか?

DDD
DDDオリジナル
2024-10-30 01:50:03805ブラウズ

Why Does My `chrome.tabs.query` Result Appear Unavailable After Calling?

chrome.tabs.query の非同期の性質: 呼び出し後に結果が利用できないように見える理由

Google Chrome の拡張機能の開発において、タブ情報を取得するchrome.tabs.query を使用するには、多くの場合、配列 (fourmTabs) を作成してタブ データを保存し、その内容にアクセスする必要があります。ただし、このコードが chrome.tabs.query の非同期の性質に合わせて正しく調整されていない場合、予期しない動作が発生する可能性があります。

次の例を考えてみましょう。

<code class="javascript">var fourmTabs = new Array();
chrome.tabs.query({}, function (tabs) {
  for (var i = 0; i < tabs.length; i++) {
    fourmTabs[i] = tabs[i];
  }
});
for (var i = 0; i < fourmTabs.length; i++) {
  if (fourmTabs[i] != null)
    window.console.log(fourmTabs[i].url);
  else {
    window.console.log("??" + i);
  }
}</code>

この例では、コードchrome.tabs.query コールバックが実行された後、配列内の各タブの URL を出力しようとします。ただし、ブレークポイントを使用せずに実行すると、コンソールは空のままですが、ブレークポイントを使用すると期待どおりの結果が得られます。

この問題は、chrome.tabs.query が非同期関数であるために発生します。つまり、そのコールバックは後続のコードとは独立して実行されます。 。ブレークポイントを使用すると、コードの実行が最初のブレークポイントで一時停止し、2 番目のループが実行される前にコールバックが完了できるようになります。ブレークポイントを使用しない場合、2 番目のループは最初のループの直後、chrome.tabs.query コールバックがタブ データを収集する前に実行されます。したがって、2 番目のループでアクセスすると、fourmTabs 配列は空になります。

この問題を解決し、コードが正しく動作することを確認するには、2 番目のループを chrome.tabs.query のコールバック関数内に移動する必要があります。こうすることで、2 番目のループの実行は、タブ データが取得された後にのみ発生することが保証されます:

<code class="javascript">chrome.tabs.query({}, function (tabs) {
  var fourmTabs = new Array();
  for (var i = 0; i < tabs.length; i++) {
    fourmTabs[i] = tabs[i];
  }
  for (var i = 0; i < fourmTabs.length; i++) {
    if (fourmTabs[i] != null)
      window.console.log(fourmTabs[i].url);
    else {
      window.console.log("??" + i);
    }
  }
});</code>

以上が呼び出し後に「chrome.tabs.query」の結果が利用できないように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。