Поиск…


замечания

Официальная документация

Отправить ответ асинхронно

В попытке отправить ответ асинхронно с обратного вызова 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 никогда не отправляются. Это происходит потому, что мы поместили sendResponse внутри асинхронного вызова ajax, когда выполняется метод success , канал сообщения был закрыт.

Решение было бы простым, если мы явно return true; в конце обратного вызова, что указывает на то, что мы хотим отправить ответ асинхронно, поэтому канал сообщения будет оставаться открытым на другом конце (вызывающем абоненте) до sendResponse пор, пока sendResponse будет выполнен 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
});

Конечно, это относится и к явному return от обратного вызова onMessage:

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