Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Chrome扩展中,当调用传递给Chrome.tabs.remove()的回调时,为什么关闭的选项卡仍然存在?_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript 在Chrome扩展中,当调用传递给Chrome.tabs.remove()的回调时,为什么关闭的选项卡仍然存在?

Javascript 在Chrome扩展中,当调用传递给Chrome.tabs.remove()的回调时,为什么关闭的选项卡仍然存在?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,如果我将回调传递给chrome.tabs.remove(),我希望在从UI和当前chrome状态中移除选项卡后调用回调。换句话说,如果我在具有选项卡权限的扩展的后台页面中运行以下代码,我希望它会生成错误,因为尝试获取不存在的选项卡会设置运行时。lastError: var tabs = []; for (var i = 0; i < 3; i++) { chrome.tabs.create({ url: "chrome://newtab" }, tab => tabs.pus

如果我将回调传递给
chrome.tabs.remove()
,我希望在从UI和当前chrome状态中移除选项卡后调用回调。换句话说,如果我在具有
选项卡
权限的扩展的后台页面中运行以下代码,我希望它会生成错误,因为尝试获取不存在的选项卡会设置
运行时。lastError

var tabs = [];
for (var i = 0; i < 3; i++) {
    chrome.tabs.create({ url: "chrome://newtab" }, tab => tabs.push(tab));
}

setTimeout(() => {
    var {id} = tabs[1];
    chrome.tabs.remove(id, () => chrome.tabs.get(id, 
        tab => console.log(id, tab)));
}, 2000);
var选项卡=[];
对于(变量i=0;i<3;i++){
chrome.tabs.create({url:chrome://newtab},tab=>tabs.push(tab));
}
设置超时(()=>{
var{id}=tabs[1];
chrome.tabs.remove(id,()=>chrome.tabs.get(id,
tab=>console.log(id,tab));
}, 2000);
但事实并非如此。打开三个新的空白选项卡,两秒钟后关闭第二个选项卡,但在传递给
chrome.tabs.remove()
的回调中调用
chrome.tabs.get()
时,仍然返回关闭的选项卡。您将在回调中看到登录到控制台的已删除选项卡的完整详细信息

这似乎是Chrome中的一个bug。在移除选项卡之前调用
chrome.tabs.remove()
中的回调有什么可能的用途?在尝试删除选项卡之前,我是否真的必须为chrome.tabs.onRemoved添加一个事件侦听器,以便在完全删除选项卡时可靠地通知我?

基于上述内容,这看起来确实像是chrome中的一个bug或延迟实现,我能看到的唯一解决办法是为
onRemoved
添加一个事件侦听器

当我的扩展弹出窗口打开时,我添加了一个事件处理程序,但是如果您只想在扩展关闭选项卡时收到通知,那么您可以使用类似这样的方法在完全删除选项卡后重新调用:

function closeTab(tabID, callback)
{
    function handleTabRemoved(tabID, removeInfo)
    {
        chrome.tabs.onRemoved.removeListener(handleTabRemoved);
        callback(tabID, removeInfo);
    }

    chrome.tabs.onRemoved.addListener(handleTabRemoved);
    chrome.tabs.remove(tabID);
}

closeTab(123, tabID => console.log(`Closed ${tabID}`);
(有一个潜在的边缘情况,用户在您的扩展关闭标签的同时关闭标签,但这可能不值得担心。)

基于上述情况,这看起来确实像是Chrome中的一个bug或延迟实现,我能看到的唯一解决办法是为
onRemoved
添加一个事件侦听器

当我的扩展弹出窗口打开时,我添加了一个事件处理程序,但是如果您只想在扩展关闭选项卡时收到通知,那么您可以使用类似这样的方法在完全删除选项卡后重新调用:

function closeTab(tabID, callback)
{
    function handleTabRemoved(tabID, removeInfo)
    {
        chrome.tabs.onRemoved.removeListener(handleTabRemoved);
        callback(tabID, removeInfo);
    }

    chrome.tabs.onRemoved.addListener(handleTabRemoved);
    chrome.tabs.remove(tabID);
}

closeTab(123, tabID => console.log(`Closed ${tabID}`);

(有一种潜在的边缘情况,用户在与扩展完全相同的时间关闭选项卡,但这可能不值得担心。)

这就是它的实现方式,我认为没有什么好的理由让它这样工作。最有可能的是它更容易实现,或者可能是一个错误。考虑报告。这是如何实施的,我看不出有什么好的理由。最有可能的是它更容易实现,或者可能是一个错误。考虑报告。