Zoeken…


Opmerkingen

Officiële documentatie

Stuur een antwoord asynchroon

In een poging asynchroon een antwoord te verzenden vanuit chrome.runtime.onMessage callback kunnen we deze verkeerde code proberen:

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);
        },
    });
});

We zouden echter ontdekken dat data nooit worden verzonden. Dit gebeurt omdat we hebben gezet sendResponse binnen een asynchrone ajax oproep, wanneer het success methode wordt uitgevoerd, is de boodschap kanaal gesloten.

De oplossing zou eenvoudig zijn, zolang we expliciet return true; aan het einde van de callback, wat aangeeft dat we een antwoord asynchroon willen verzenden, zodat het berichtkanaal voor het andere einde (beller) open blijft totdat sendResponse wordt uitgevoerd.

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
});

Natuurlijk is dit ook van toepassing op een expliciet return van de onMessage-callback:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow