onMessage.addListener: sendResponse - PullRequest
       0

onMessage.addListener: sendResponse

0 голосов
/ 30 января 2019

Простите, если когда-либо был дан ответ, я искал более 1 часа, но не нашел способа решить мою проблему.

Итак, вот моя проблема:

Я пишу расширение для Chrome и у меня есть 2 JS-скрипта, "script.js" и "background.js".В моем script.js я использую chrome.runtime.sendMessage для сообщения моего фонового скрипта.

С помощью моего фонового скрипта я заставил слушателя принять сообщение и загрузить несколько изображений по ссылкам, предоставленным через сообщение, что означаетЭта функция может занять до 1 минуты до окончания загрузки.(Кстати, я использую обещание, тогда я знаю, что мой код выполняется шаг за шагом)

script.js

chrome.runtime.sendMessage({message: "download", parameters: images}, function (response) {
    console.log(response);
});

background.js

chrome.runtime.onMessage.addListener(function (arg, sender, sendResponse) {
    doSomeLongStuff().then(function () {
        sendResponse(myResponse);
        return true;
    })
});

И в моем сценарии я не могу получить ответ.Даже если я добавлю setInterval к ​​responseCallback, ответ всегда будет undefined

Если кто-нибудь скажет мне, есть ли способ заставить responseCallback ждать длинного ответа, любая помощь будетоценили.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

РЕШЕНИЕ:

Утканос принес правильный ответ, поэтому, если кто-то ищет тот же ответ, вот как он работает сейчас:

script.js

chrome.runtime.sendMessage({message: "download", "parameters": images});
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
    console.log(request);
});

background.js

chrome.runtime.onMessage.addListener(function (arg, sender, sendResponse) {
    doSomeLongStuff().then(function () {
        chrome.tabs.sendMessage(sender.tab.id, {'status': 'finished'});
    })
});
0 голосов
/ 30 января 2019

Это распространенная проблема, то есть возврат ответа от асинхронной операции.Chrome будет игнорировать любой вызов sendResponse(), если он не выполнен синхронно.

Решение состоит не в том, чтобы думать с точки зрения отправки ответа, а в том, чтобы отправить последующее сообщение самостоятельно.

chrome.runtime.onMessage.addListener(function (arg, sender, sendResponse) {
    doSomeLongStuff().then(function () {
        //don't call sendResponse() here, send a separate message to script.js
        return true;
    })
});

Вы отправляете это через chrome.tabs.sendMessage в обратном вызове на запрос к chrome.tabs.query. Docs .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...