我正在尝试显示当前活动标签的标签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
答案 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")
在处理程序完成执行之前实际上不会返回。
这是怪异的。我想知道除alert
,confirm
和prompt
之外的其他功能是否会出现此行为,如果可以在Chrome API之外重现它。
我也想知道它是否是故意的,如果是的话,理由是什么。某种(无证件?)死锁预防?
至于解决方法 - 请勿使用alert()
和朋友进行调试。 console.log()
不会阻止并按预期工作。
要查看背景页面的控制台,您可以转到chrome://extensions/
;要查看弹出窗口的控制台,请右键单击该按钮并选择“Inspect popup”。