从嵌套函数返回当前网址 - Chrome扩展程序

时间:2017-12-07 16:49:31

标签: javascript function google-chrome-extension return

我尝试制作一个获取当前所选标签的网址的Chrome扩展程序,但我遇到了一个问题,我无法获取该网址存储的变量回来。

我已经尝试了几件事,但这是我期望工作的代码:

function getStream() {
    alert(getLinking());
}

function getLinking() {
    chrome.tabs.query({
            'active': true,
            'windowId': chrome.windows.WINDOW_ID_CURRENT
        },
        function getURL(tabs) {
            var URL = tabs[0].url;
            return URL;
        }
    );
    return getURL();
}

document.addEventListener('DOMContentLoaded', function () {
    document.getElementById('start').addEventListener('click', getStream);
});

然而,它并没有实际返回任何内容,因此警报并未显示。请注意,返回变量URL对我来说非常重要,所以我可以在getStream函数中使用它,只需在getURL函数中添加警报就不是我正在寻找的东西

如果有人能帮助我,那将是非常棒的,我对javascript还不太熟悉,而且我对chrome扩展特别不熟悉,所以每一点建议都可以提供帮助。

1 个答案:

答案 0 :(得分:1)

方法chrome.tabs.query是异步的,因此需要回调才能返回结果。

当您使用异步调用时,您可以使用任何处理结果:

  • 回调
  • 承诺
  • 异步/ AWAIT

请检查此问题:How do I return the response from an asynchronous call?

根据您的代码,最简单的解决方案是:

function getStream() {
    getLinking(function(URL) { // passing a callback 
        alert(URL)
    });
}

function getLinking(callback) { // callback - is a function that will be called when async call finished
    chrome.tabs.query({
            'active': true,
            'windowId': chrome.windows.WINDOW_ID_CURRENT
        },function(tabs) {
            callback(tabs[0].url); // run callback with a result
        }
    );
    // do not need to return anything
}

document.addEventListener('DOMContentLoaded', function () {
    document.getElementById('start').addEventListener('click', getStream);
});