サーチ…


備考

公式文書

応答を非同期で送信する

chrome.runtime.onMessageコールバックから応答を非同期的に送信しようとすると、この間違ったコードを試すことがあります

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    $.ajax({
        url: 'https://www.google.com',
        method: 'GET',
        success: function(data) {
            // data won't be sent
            sendResponse(data);
        },
    });
});

しかし、 dataが送信されることはありません。これは、 successメソッドが実行され、メッセージチャネルが閉じられたsendResponseに、非同期のajax呼び出しの中にsendResponseを置いたために発生します。

解決策は明示的return true;return true;限り簡単 return true;コールバックの最後に、応答を非同期的に送信したいことを示します。したがって、 sendResponseが実行されるまで、メッセージチャネルは相手(呼び出し側)にオープンされたままになります。

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    $.ajax({
        url: 'https://www.google.com',
        method: 'GET',
        success: function(data) {
            // data would be sent successfully
            sendResponse(data);
        },
    });

    return true; // keeps the message channel open until `sendResponse` is executed
});

もちろん、onMessageコールバックからの明示的なreturnにも適用されます。

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.action == 'get') {
        $.ajax({
            url: 'https://www.google.com',
            method: 'GET',
            success: function(data) {
                // data would be sent successfully
                sendResponse(data);
            },
        });

        return true; // keeps the message channel open until `sendResponse` is executed
    }

    // do something synchronous, use sendResponse

    // normal exit closes the message channel
});


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow