google-chrome-extension - 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);
});
解决方案
该循环会挂起浏览器,因为您无需在 chrome.tabs.get 调用之间等待,因此您的代码会在一秒钟内生成数百万个此类调用。
从使用情况来看,window
你正在编写一个经典的 ManifestV2 扩展,这意味着你不能使用chrome
API 的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');
});
推荐阅读
- javascript - 如何获得2个球/物体之间的距离?
- r - R lubridate:将助手应用于数据框
- python - “具有多个元素的数组的真值不明确。为什么我会收到此错误?
- azure - 将 azure ml 工作室设计器项目导出为 jupyter 笔记本?
- python - SQL - 以编程方式比较 sql ddl
- jquery - 如何使用 jquery ajax 在 laravel 中根据我的数据库值 0 或 1 更改按钮类和 fontawesome 图标?
- git - 将本地文件夹重新连接到远程存储库
- python - Keras LSTM 输入和输出变量范围
- python - Pygame:每x时间重复一个动作
- c - strcmp() 的模棱两可的行为