Функция возвращает {} при первом запуске, а затем работает правильно - PullRequest
0 голосов
/ 12 июля 2019

У меня есть функция, которая предназначена для предоставления скрипту содержимого некоторых данных json. Проблема в том, что он работает правильно только на 2-й + запуск. Понятия не имею, как ее решить: (

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 голосов
/ 12 июля 2019

chrome.tabs.getAllInWindow является асинхронным - поэтому sendResponse работает до того, как function (tabs_) get получит шанс сделать свое дело ... поместите последние две строки ВНУТРИ обратного вызова - как это

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
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...