首页 > 解决方案 > chrome 扩展 - 如何使用 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);
});

标签: google-chrome-extension

解决方案


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

从使用情况来看,window你正在编写一个经典的 ManifestV2 扩展,这意味着你不能使用chromeAPI 的Promise 语法await,而是使用需要经典的回调语法或自己 Promisify 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 使用 Promises:

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');
});

推荐阅读