Chrome 扩展名:runtime.lastError 而 运行 选项卡。get/tabs。删除:没有带有 id:0 的选项卡
Chrome Extension: runtime.lastError while running tabs.get/tabs.remove: No tab with id:0
我试图找到解决方案,但我唯一发现的是随机 TabId 是否不存在。但这并不能解决我的问题:
我总是遇到这些错误:
Unchecked runtime.lastError while running tabs.get: No tab with id:0
Unchecked runtime.lastError while running tabs.remove: No tab with id:0
我的代码:
var tabnumber = 0; //the number of tabs in the current window
var tabID = 0; //id of the active tab
function closeBundle(){
getTabnumber();
for(i=0;i<tabnumber;i++){
getTabID();
chrome.tabs.get(tabID , function(tab){ //here is the first problem
insert[i] = tab; //for saving all Tabs in an array
});
chrome.tabs.remove(tabID); //here the second one
}
chache[active] = insert; //I save the insert array in another array
}
function getTabnumber(){
chrome.tabs.query({'currentWindow': true}, function(tabarray){
tabnumber = tabarray.length;
});
}
function getTabID(){
chrome.tabs.query({'currentWindow': true, 'active': true}, function(tabArray){
tabID = tabArray[0].id;
});
}
我不明白为什么没有具有此特定 ID 的选项卡,因为我使用了活动选项卡的 TabId(带有 getTabId),不是吗??
如何获取当前选项卡的正确 ID 或者是否有其他方法将当前 window 的所有选项卡存储在一个数组中然后关闭所有选项卡?
我希望有人能帮助我 ;)
Xan 为您提供了关于正在发生的事情的极好线索,但让我尝试回答您的问题,因为它尤其与 chrome 扩展有关。您在 getTabID 运行s 中的回调函数是异步的,这意味着它不会阻止任何其他代码 运行。因此,在 closeBundle 中,您调用 getTabID,它开始 运行,但 closeBundle 甚至在 getTabID 完成 运行 回调之前继续 运行。因此调用chrome.tabs.get时tabID还是0,报错。简而言之,由于 JavaScript 的异步性质,您的代码的整个架构将无法正常工作。
一个现成的解决方案是将所有内容包装在回调函数中(通常称为回调地狱)。我已经构建了 chrome 个带有 5 或 6 个嵌套回调函数的扩展。人们确实需要了解这种异步行为才能对 chrome 扩展进行编程和调试,一般而言 JavaScript。快速 Google 搜索将为您提供有关该主题的无穷无尽的文章。 Xan 的评论是一个很好的起点。
但例如在您的代码中,某些伪代码可能如下所示:
function getTabnumber(){
chrome.tabs.query({'currentWindow': true}, function(tabarray){
tabnumber = tabarray.length;
for(i=0;i<tabnumber;i++){
chrome.tabs.query({'currentWindow': true, 'active': true}, function(tabArray){
tabID = tabArray[0].id;
chrome.tabs.get(tabID , function(tab){ //here is the first problem
insert[i] = tab; //for saving all Tabs in an array
});
chrome.tabs.remove(tabID); //here the second one
}
});
});
}
此代码未经测试或旨在 运行,只是为了让您了解我所说的嵌套回调的含义。希望这有帮助,祝你好运。
我试图找到解决方案,但我唯一发现的是随机 TabId 是否不存在。但这并不能解决我的问题:
我总是遇到这些错误:
Unchecked runtime.lastError while running tabs.get: No tab with id:0
Unchecked runtime.lastError while running tabs.remove: No tab with id:0
我的代码:
var tabnumber = 0; //the number of tabs in the current window
var tabID = 0; //id of the active tab
function closeBundle(){
getTabnumber();
for(i=0;i<tabnumber;i++){
getTabID();
chrome.tabs.get(tabID , function(tab){ //here is the first problem
insert[i] = tab; //for saving all Tabs in an array
});
chrome.tabs.remove(tabID); //here the second one
}
chache[active] = insert; //I save the insert array in another array
}
function getTabnumber(){
chrome.tabs.query({'currentWindow': true}, function(tabarray){
tabnumber = tabarray.length;
});
}
function getTabID(){
chrome.tabs.query({'currentWindow': true, 'active': true}, function(tabArray){
tabID = tabArray[0].id;
});
}
我不明白为什么没有具有此特定 ID 的选项卡,因为我使用了活动选项卡的 TabId(带有 getTabId),不是吗??
如何获取当前选项卡的正确 ID 或者是否有其他方法将当前 window 的所有选项卡存储在一个数组中然后关闭所有选项卡?
我希望有人能帮助我 ;)
Xan 为您提供了关于正在发生的事情的极好线索,但让我尝试回答您的问题,因为它尤其与 chrome 扩展有关。您在 getTabID 运行s 中的回调函数是异步的,这意味着它不会阻止任何其他代码 运行。因此,在 closeBundle 中,您调用 getTabID,它开始 运行,但 closeBundle 甚至在 getTabID 完成 运行 回调之前继续 运行。因此调用chrome.tabs.get时tabID还是0,报错。简而言之,由于 JavaScript 的异步性质,您的代码的整个架构将无法正常工作。
一个现成的解决方案是将所有内容包装在回调函数中(通常称为回调地狱)。我已经构建了 chrome 个带有 5 或 6 个嵌套回调函数的扩展。人们确实需要了解这种异步行为才能对 chrome 扩展进行编程和调试,一般而言 JavaScript。快速 Google 搜索将为您提供有关该主题的无穷无尽的文章。 Xan 的评论是一个很好的起点。
但例如在您的代码中,某些伪代码可能如下所示:
function getTabnumber(){
chrome.tabs.query({'currentWindow': true}, function(tabarray){
tabnumber = tabarray.length;
for(i=0;i<tabnumber;i++){
chrome.tabs.query({'currentWindow': true, 'active': true}, function(tabArray){
tabID = tabArray[0].id;
chrome.tabs.get(tabID , function(tab){ //here is the first problem
insert[i] = tab; //for saving all Tabs in an array
});
chrome.tabs.remove(tabID); //here the second one
}
});
});
}
此代码未经测试或旨在 运行,只是为了让您了解我所说的嵌套回调的含义。希望这有帮助,祝你好运。