我正在为Chrome扩展程序编写一个功能,以获取当前标签的状态('加载'或者#39;完成')。
currentTabId是一个全局变量。
function getTabStatus() {
var tabStatus = "foobar";
chrome.tabs.get(currentTabId, function(tab) {
tabStatus = tab.status;
});
return tabStatus;
}
我希望这个功能可以返回' loading'或者'完成'但它已经回归了foobar'
如果我在第5行的Chrome开发者工具中设置断点(tabStatus = tab.status),则该函数已经返回' foobar'但仍然在断点处停止。
答案 0 :(得分:1)
这是由异步编程引起的。 chrome.tabs.get
会执行,return tabStatus
会在tabStatus = tab.status
之前运行。您需要安排代码,使其在chrome.tabs.get
内继续运行。
正在进行的是,chrome.tabs.get
传递了一个回调(您的匿名函数function(tab)
),以便在执行get
时执行,因此代码为tabStatus = tab.status
在您的代码执行return tabStatus
之后实际运行。
你需要重写你的代码:
function getTabStatus() {
var tabStatus = "foobar";
chrome.tabs.get(currentTabId, function(tab) {
tabStatus = tab.status;
doSomething(tabStatus);
});
}
您需要调用另一个继续执行代码的方法,而不是执行调用返回样式。
这样做的原因是你的代码在继续运行之前不必等待get
执行,有点像多线程。它允许您的代码分支到两个方向,可以同时执行两个不同的代码路径,但是某些变量不在正确的范围内,所以当遇到这样的问题时就是这样。
您可以阅读有关异步编程here的更多信息。