我必须调用return true每次我使用onMessage.addListener responseCallback

Do I have to call return true each time I use onMessage.addListener responseCallback?

本文关键字:onMessage responseCallback addListener 调用 return true      更新时间:2023-09-26

我有一个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
        });
    }
}

(这是一个节选,但它是工作代码,请忽略所有的if,我应该用case从很久以前)

每次我使用回调函数sendResponse(再次,我需要重命名它,但让我们忽略它),在文档中定义的从来没有使用,除非我有return true后,它的执行。这真的有必要吗,还是我只是发现了一个肮脏的黑客,我做错了什么?

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

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

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

因此,有必要告诉Chrome "expect an answer later"