我有一个onMessage.addListener函数,如下所示:
chrome.runtime.onMessage.addListener(function (r, s, sendResponse) {
if (r.action == "read") {
readManga(request, function () {
sendResponse({});
}, true);
}
if (r.action == "write") {
readManga(request, function () {
sendResponse({});
}, true);
}
if (request.action == "update") {
$.each(request.list, function (index, val) {
resetManga(val, function () {}, false);
});
saveList();
refreshUpdate();
sendResponse({});
}
if (request.action == "release") {
releaseImplentationFromId(request.id, function (mirrorName) {
updateMirrors(function () {
sendResponse({
mirror : mirrorName
});
});
return true
});
}
}
(这是摘录,但是it's working code请忽略所有的if,我应该在很久以前使用过案例)
每次我使用回调函数sendResponse
(同样,我需要重命名它,但让我们忽略它),因为定义in the documentation永远不会被使用,除非我之后有return true
&# 39;执行。这真的是必要的还是我发现了一个肮脏的黑客并且我做错了什么?
答案 0 :(得分:2)
这是预期的行为,并在documentation中明确说明:
当事件侦听器返回时,此函数[
sendResponse
]变为无效,除非您从事件侦听器返回true
以指示您希望异步发送响应(这将使消息通道保持打开状态)另一端直到sendResponse
被调用。)
您的函数updateMirrors
显然是异步的:回调函数不会立即执行但会被发送到队列中。所以,你在“执行之后”没有返回真实,你实际上是在return true
之前点击sendResponse
。
因此,有必要告诉Chrome“以后会有答案”。