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');
});
我正在尝试在异步函数 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');
});