chrome Extension - Alert语句更改结果

时间:2014-10-01 04:38:32

标签: javascript-events google-chrome-extension google-chrome-devtools

我正在尝试显示当前活动标签的标签ID和标签网址。但是,如果我评论所有警报语句(1,2和3),我不会按预期获得结果。例如:如果我注释掉所有警告语句,那么第一次按ALT + A时,我在URL中获得空值,在ID字段中获得0,这意味着变量未初始化。 //TabBackGround.js

var currentTabId = 0;
var currentTabURL = "null";

chrome.commands.onCommand.addListener(function(command) {

    alert ("1. Inside Listener"); //1
    chrome.tabs.query({active:true, currentWindow: true}, function(arrayOfTabs) {

        alert("2. Filtering Results");  //2
        currentTabURL = arrayOfTabs[0].url;
        currentTabId = arrayOfTabs[0].id; 

    });

    if (command == "toggle") 
    {
        alert ("3. Resolved Command"); //3
        alert ("TAB ID = " + currentTabId + "\n URL =  " + currentTabURL);
    }    
});

但是,如果我保留所有警报语句扩展工作正常。 我不明白的是,警报声明如何在最终结果中产生差异! ! //Manifest.json

{
  "manifest_version": 2,

  "name": "Display Tab Information",
  "description": "Extension will display Tab Id and Tab URL in an alert box",
  "version": "1.0",

  "background": {
    "persistent": false,
    "scripts": ["TabBackGround.js"]
  },

  "commands":
    {
        "toggle" : 
        {
            "suggested_key": {
              "default": "Alt+A",
              "mac": "Command+Shift+Y"
            },
            "description" : "Display Id and URL of the current open/active tab."
        }
    },

  "permissions": ["tabs", "background"],

  "browser_action": {
    "default_title": "This App will display Tab Id and Tab URL when user issues the command.",
    "default_icon": "hello.png"
  }     
}

另一点需要注意的是 var currentTabId = 0; var currentTabURL =“null”;

chrome.commands.onCommand.addListener(function(command){

//alert ("1. Inside Listener");
chrome.tabs.query({active:true, currentWindow: true}, function(arrayOfTabs) {

    alert("2. Filtering Results");
    currentTabURL = arrayOfTabs[0].url;
    currentTabId = arrayOfTabs[0].id; 

});

if (command == "toggle") 
{
    alert ("3. Resolved Command" + "TAB ID = " + currentTabId + "\n URL =  " + currentTabURL);
    alert ("4. Check when does this get executed" + "TAB ID = " + currentTabId + "\n URL =  " + currentTabURL);
    alert ("TAB ID = " + currentTabId + "\n URL =  " + currentTabURL);
}    

});

发现执行路径是警报3(当前Id = 0和CurrentURL = null)然后警报2已执行,然后使用正确的当前ID和当前URL值警告4

1 个答案:

答案 0 :(得分:0)

好的,这是一个有趣的问题。我撤回了我的重复投票。

考虑以下代码:

setTimeout(function() {
  alert("C"); // Should be next in queue for execution
}, 0);
alert("A");
alert("B");

正如预期的那样,它输出序列A,B,C,因为异步执行的函数仅在主执行线程返回后执行。 alert("A") 阻止线程,但该函数尚未返回,因此下一个执行的语句为alert("B")

但是,在alert阻止浏览器时,Chrome API会劫持执行!

考虑(以下代码段必须在chrome扩展程序的背景页面的上下文中运行):

chrome.tabs.query({}, function() { 
  alert("C"); // Should be in queue for execution after results are available?..
});
alert("A");
alert("B");

第一行在Chrome中调用本机代码操作,并为结果注册处理程序。

第二行阻止执行;通常,这通常意味着一切都停止了。 但此时Chrome会执行query回调!

因此,最终结果是序列A,C,B。

可以观察到这个队列外执行没有自己独立的队列:

chrome.tabs.query({}, function() {
  setTimeout( function(){
    alert("C");
  }, 0);
});
alert("A");
alert("B");

将给出预期的A,B,C序列。在显示第一个警报时调用处理程序,并在主“执行队列”中按alert(C)。其他测试还表明,alert("A")在处理程序完成执行之前实际上不会返回。


这是怪异的我想知道除alertconfirmprompt之外的其他功能是否会出现此行为,如果可以在Chrome API之外重现它。

我也想知道它是否是故意的,如果是的话,理由是什么。某种(无证件?)死锁预防?


至于解决方法 - 请勿使用alert()和朋友进行调试。 console.log()不会阻止并按预期工作。

要查看背景页面的控制台,您可以转到chrome://extensions/;要查看弹出窗口的控制台,请右键单击该按钮并选择“Inspect popup”。