Suche…


Bemerkungen

Offizielle Dokumentation

Antwort asynchron senden

Beim Versuch, eine Antwort asynchron aus chrome.runtime.onMessage Rückruf von chrome.runtime.onMessage zu senden, versuchen wir möglicherweise diesen falschen Code :

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

Wir würden jedoch feststellen, dass data niemals gesendet werden. Dies geschieht, weil wir sendResponse in einen asynchronen Ajax-Aufruf gestellt haben. Wenn die success ausgeführt wird, wurde der Nachrichtenkanal geschlossen.

Die Lösung wäre einfach, solange wir explizit return true; am Ende des Rückrufs, was bedeutet, dass wir eine Antwort asynchron senden möchten, sodass der Nachrichtenkanal für das andere Ende (Aufrufer) sendResponse bleibt, bis sendResponse ausgeführt wird.

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

Natürlich gilt dies auch für eine explizite return aus dem 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow