onMessage.addListener:sendResponse

时间:2019-01-30 13:52:40

标签: javascript google-chrome-extension

如果已经给出答案,请原谅我,我已经搜索了1个多小时,但没有找到解决问题的方法。

这是我的问题:

我正在编码chrome扩展,并且有2个JS脚本“ script.js”和“ background.js”。在我的script.js中,我正在使用chrome.runtime.sendMessage向后台脚本发送消息。

使用我的后台脚本,我使一个侦听器接收该消息并从通过该消息提供的链接下载几张图像,这意味着该功能最多可能需要1分钟才能完成下载。 (顺便说一句,我正在使用Promise,然后我知道我的代码是逐步执行的)

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 :(得分:0)

这是一个常见的问题,即从异步操作返回响应。如果未同步完成,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.queryDocs

答案 1 :(得分:-1)

解决方案:

Utkanos给出了正确的答案,因此,如果有人在寻找相同的答案,这就是现在的工作方式:

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'});
    })
});