Chrome扩展程序:异步查询标签页

4

我有两个变量被设置为函数的“返回值”,这些函数是用于获取标签页的URL和实际标签页对象的引用,并将它们存储在变量中。我有一些代码:

function init(){
    var url = getUrl();
    var tab = getTab();
}

function getUrl(){
    var tablink;
    chrome.tabs.query({currentWindow: true, active: true},function(tabs){
        tablink = tabs[0].url;
        return tablink;
    });

}

function getTab(){
    var tab;
    chrome.tabs.query({currentWindow: true, active: true},function(tabs){
        tab = tabs[0];
    });
    return tab;
}

为什么URL未定义,尽管我从回调函数中返回了URL,但当我从回调函数外部返回tab时,它可以正常返回,就像这是同步调用一样。我在调试器中有一个关于这种现象的截图。我正在尽力学习如何处理chrome中的异步方法,但这非常令人困惑。有人能解释一下这种行为吗?


1
可能是一个重复的问题:在调用chrome.tabs.query之后,结果不可用 - Rob W
1个回答

7
正如您所说,chrome.tabs.query函数是异步的。因此,您不能依赖于return,而必须使用回调函数。Chrome扩展程序的文档已经很好地解释了这一点:http://developer.chrome.com/extensions/overview.html#sync-example 所以在您的情况下,以下代码可能有效(取决于您希望对其进行什么操作)。
var url, tab;
function init(){
    chrome.tabs.query({currentWindow: true, active: true},function(tabs){
       url = tabs[0].url;
       tab = tabs[0];
       //Now that we have the data we can proceed and do something with it
       processTab();
    });
}

function processTab(){
    // Use url & tab as you like
    console.log(url);
    console.log(tab);
}

我真的只是想找到一种将选项卡保存为变量的方法。我无法找到在异步函数执行后访问函数结果的方法。 - aclave1
我稍微调整了我的答案,现在将结果存储在变量中而不是直接传递它们。但由于这是异步运行的,你需要使用并调用一个额外的函数来进一步使用数据(这就是回调)。 - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接