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

此代码未经测试或旨在 运行,只是为了让您了解我所说的嵌套回调的含义。希望这有帮助,祝你好运。