chrome extension - 如何使用 setTimeout 循环?

chrome extension - How to loop with setTimeout?

我正在尝试在异步函数 setTimeout 中循环,以获取选项卡索引,因为 chrome.tabs.get 有时会崩溃,所以,我必须使用循环。 但是循环卡住了浏览器。 我该如何使用循环?

// backround.js
var w=0;
chrome.tabs.onActivated.addListener( function(activeInfo) {
 w=0;
 setTimeout (async function (){
   while (window.w===0) {
     await chrome.tabs.get(activeInfo.tabId, function(tab){w=tab.index})
  };
 alert(window.w)}
            ,100);
});

循环挂起浏览器,因为您没有在 chrome.tabs.get 的调用之间等待,因此您的代码在一秒钟内生成数百万个此类调用。

根据 window 的使用判断,您正在编写经典的 ManifestV2 扩展,这意味着您不能使用 chrome API 以及 await 的 Promise 语法,而是使用需要经典回调语法或自己承诺 API。

ManifestV2 使用回调:

chrome.tabs.onActivated.addListener(function onActivated(info) {
  chrome.tabs.get(info.tabId, tab => {
    if (chrome.runtime.lastError) {
      setTimeout(onActivated, 50, info);
      return;
    }
    // do something here
    console.log('Success');
  });
});

ManifestV3 使用承诺:

chrome.tabs.onActivated.addListener(async function onActivated(info) {
  let tab;
  try {
    tab = await chrome.tabs.get(info.tabId);
  } catch (e) {
    setTimeout(onActivated, 50, info);
    return;
  }
  // do something here
  console.log('Success');
});