Abi*_*bid 146 javascript google-chrome google-chrome-extension google-chrome-app
我试图在内容脚本和扩展名之间传递消息
这是我在content-script中的内容
chrome.runtime.sendMessage({type: "getUrls"}, function(response) {
console.log(response)
});
Run Code Online (Sandbox Code Playgroud)
在我的后台脚本中
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.type == "getUrls"){
getUrls(request, sender, sendResponse)
}
});
function getUrls(request, sender, sendResponse){
var resp = sendResponse;
$.ajax({
url: "http://localhost:3000/urls",
method: 'GET',
success: function(d){
resp({urls: d})
}
});
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我在getUrls函数中的ajax调用之前发送响应,则响应成功发送,但是当我发送响应时,在ajax调用的success方法中它不发送它,当我进入调试时我可以看到sendResponse函数代码中的端口为null .
rsa*_*hez 335
从以下文档chrome.runtime.onMessage.addListener:
当事件侦听器返回时,此函数变为无效,除非您从事件侦听器返回true以指示您希望异步发送响应(这将使消息通道保持打开到另一端,直到调用sendResponse).
因此,您只需return true;在调用后添加,getUrls以指示您将异步调用响应函数.
接受的答案是正确的,我只想添加简化此示例的示例代码.问题是API(在我看来)设计得不好,因为它迫使我们的开发人员知道特定的消息是否会被异步处理.如果您处理许多不同的消息,这将成为一项不可能完成的任务,因为您永远不知道某些函数是否内部传递的sendResponse将被称为async.考虑一下:
chrome.extension.onMessage.addListener(function (request, sender, sendResponseParam) {
if (request.method == "method1") {
handleMethod1(sendResponse);
}
Run Code Online (Sandbox Code Playgroud)
我怎么知道内部handleMethod1呼叫是否异常?修改的人怎么handleMethod1知道它会通过引入异步来打破调用者?
我的解决方案是:
chrome.extension.onMessage.addListener(function (request, sender, sendResponseParam) {
var responseStatus = { bCalled: false };
function sendResponse(obj) { //dummy wrapper to deal with exceptions and detect async
try {
sendResponseParam(obj);
} catch (e) {
//error handling
}
responseStatus.bCalled= true;
}
if (request.method == "method1") {
handleMethod1(sendResponse);
}
else if (request.method == "method2") {
handleMethod2(sendResponse);
}
...
if (!responseStatus.bCalled) { //if its set, the call wasn't async, else it is.
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
无论您选择如何处理消息,这都会自动处理返回值.请注意,这假设您永远不会忘记调用响应函数.另请注意,铬可以为我们自动化,我不明白为什么他们没有.
| 归档时间: |
|
| 查看次数: |
49144 次 |
| 最近记录: |