首頁  >  文章  >  web前端  >  為什麼我的`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 是一個非同步函數,這表示它的回呼是獨立於後續程式碼執行的。使用斷點時,程式碼執行會在第一個斷點暫停,從而允許回呼在執行第二個循環之前完成。如果沒有斷點,第二個循環將在第一個循環之後立即執行,然後 chrome.tabs.query 回呼有時間收集選項卡資料。因此,在第二個循環中存取 fourmTabs 陣列時,其為空。

要解決此問題並確保程式碼正確運行,需要將第二個循環移至 chrome.tabs.query 的回呼函數內。這樣,保證僅在檢索到選項卡資料後才執行第二個循環:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn