函数在第一次运行时返回{},然后正常工作

时间:2019-07-12 01:15:12

标签: javascript google-chrome-extension

我有一个功能,可以为内容脚本提供一些json数据。该问题仅在第二次运行时才能正常运行。不知道如何解决:(

let links = {};

chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {

    if (request.get == "links") {
        chrome.tabs.getAllInWindow(null, function (tabs_) {

            for (var i = 0; i < tabs_.length; i++) {
                if ((tabs_[i]['url'].match(some_var))) {
                    links[i] = [tabs_[i]['title'],
                        tabs_[i]['index']
                    ];
                }
            }
            console.log(links);              
        });

        console.log(JSON.stringify(links));
        sendResponse({reply: JSON.stringify(links)});
    }
});

我第一次运行该函数时,它将返回一个空对象{},然后工作正常。

1 个答案:

答案 0 :(得分:0)

chrome.tabs.getAllInWindow是异步的-因此sendResponsefunction (tabs_)才有机会做它的事情之前正在运行...将最后两行放在回调内部-像这样

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
    if (request.get == "links") {
        chrome.tabs.getAllInWindow(null, function (tabs_) {
            const links = {};
            for (var i = 0; i < tabs_.length; i++) {
                if ((tabs_[i]['url'].match(some_var))) {
                    links[i] = [tabs_[i]['title'],
                        tabs_[i]['index']
                    ];
                }
            }
            console.log(links);              
            console.log(JSON.stringify(links));
            sendResponse({reply: JSON.stringify(links)});
        });
        return true; // this signifies the response is asynchronous
    }
});