Ricerca…


Osservazioni

Documentazione ufficiale

Invia una risposta in modo asincrono

Nel tentativo di inviare una risposta in modo asincrono dal callback chrome.runtime.onMessage potremmo provare questo codice errato :

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

Tuttavia, troveremmo che i data non sono mai stati inviati. Ciò accade perché abbiamo inserito sendResponse all'interno di una chiamata asincrona ajax, quando il metodo di success è stato eseguito, il canale del messaggio è stato chiuso.

La soluzione sarebbe semplice, purché return true; esplicitamente return true; alla fine del callback, che indica che desideriamo inviare una risposta in modo asincrono, quindi il canale del messaggio sarà tenuto aperto all'altro capo (chiamante) fino a quando sendResponse verrà eseguito.

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

Naturalmente, si applica anche a un return esplicito dal callback 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow