每次使用onMessage.addListener responseCallback时,是否必须调用return true?

时间:2014-06-25 01:26:10

标签: javascript google-chrome-extension

我有一个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;执行。这真的是必要的还是我发现了一个肮脏的黑客并且我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是预期的行为,并在documentation中明确说明:

  

当事件侦听器返回时,此函数[sendResponse]变为无效,除非您从事件侦听器返回true以指示您希望异步发送响应(这将使消息通道保持打开状态)另一端直到sendResponse被调用。)

您的函数updateMirrors显然是异步的:回调函数不会立即执行但会被发送到队列中。所以,你在“执行之后”没有返回真实,你实际上是在return true之前点击sendResponse

因此,有必要告诉Chrome“以后会有答案”。