为什么我无法发送 getJSON 成功的响应?

Why do I fail to send response on getJSON's success?

我正在开发一个简单的 Chrome 扩展。我有类似的东西

/* content script */
chrome.runtime.sendMessage({msg: "marco"}, function(response){
    if (response.foo){
        console.log(response.foo);
    }
});

/* background script */
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
    if (request.msg){

        // sendResponse({foo: "polo"}); // works fine

        // load a local JSON file
        $.getJSON("path/to/file.js", function(data){
            console.log("success"); // works fine
            sendResponse({foo: "polo"}); // does not work
        });
    }
});

正如您可能看到的那样,从 getJSON 的回调主体调用 sendResponse 似乎没有发送响应,尽管调用 log 就在上面它执行完美。如果我从 getJSON 的回调主体外部调用 sendResponse,它会正常发送响应。

知道可能是什么问题吗?

在侦听器函数的末尾,您必须 return "true" 以便与内容脚本的连接保持打开状态。 在异步调用中,侦听器函数将结束并且端口将立即关闭,因此 sendResponse 函数将不执行任何操作。

来自documentation

This function becomes invalid when the event listener returns, unless you return true from the event listener to indicate you wish to send a response asynchronously (this will keep the message channel open to the other end until sendResponse is called).