Javascript chrome扩展脚本中的函数返回了错误的值

Javascript chrome扩展脚本中的函数返回了错误的值,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在为一个chrome扩展编写一个函数,它获取当前选项卡的状态(“正在加载”或“已完成”) currentTabId是一个全局变量 function getTabStatus() { var tabStatus = "foobar"; chrome.tabs.get(currentTabId, function(tab) { tabStatus = tab.status; }); return tabStatus; } 我希望这个函数返回'

我正在为一个chrome扩展编写一个函数,它获取当前选项卡的状态(“正在加载”或“已完成”)

currentTabId是一个全局变量

function getTabStatus() {
    var tabStatus = "foobar";

    chrome.tabs.get(currentTabId, function(tab) {
        tabStatus = tab.status;
    });

    return tabStatus;
}
我希望这个函数返回'loading'或'complete',但它返回'foobar'


如果我在Chrome developer tools的第5行设置了一个断点(tabStatus=tab.status),则函数已经返回“foobar”,但仍然在断点处停止。

这是由于异步编程造成的
chrome.tabs.get
执行,但
return tabStatus
tabStatus=tab.status
之前运行。您需要以这样一种方式排列代码,即它可以从
chrome.tabs.get
中继续运行

正在进行的是,
chrome.tabs.get
被传递一个回调(您的匿名函数
function(tab)
)以在执行
get
时执行,因此代码是
tabStatus=tab。status
实际上是在您的代码执行
返回tabStatus
之后运行的

您需要像这样重写代码:

function getTabStatus() {
    var tabStatus = "foobar";

    chrome.tabs.get(currentTabId, function(tab) {
        tabStatus = tab.status;
        doSomething(tabStatus);
    });
}
您需要调用另一个将继续执行代码的方法,而不是执行调用返回样式

之所以这样做,是因为您的代码不必等待
get
执行后才能继续运行,就像多线程一样。它允许您的代码分支到两个方向,可以同时执行两个不同的代码路径,但有些变量不在正确的范围内,因此您会遇到这样的问题


您可以阅读有关异步编程的更多信息。

那么,所有(或大多数)Chrome api函数都是异步的吗?许多api函数都是异步的,这是因为在某些情况下,它可以使您的代码更快,因为它不会阻止其他代码的执行。从回调函数内部返回不起作用,因为回调函数是另一个函数,因此可以从该函数返回,但不能完全返回到原始范围。不幸的是,没有简单的方法可以将异步函数转换为您可能已经习惯的调用返回样式的格式。