Ich versuche, Nachrichten zwischen dem Inhaltsskript und der Erweiterung zu übergeben
Folgendes habe ich im Content-Skript
chrome.runtime.sendMessage({type: "getUrls"}, function(response) {
console.log(response)
});
Und im Hintergrundskript habe ich
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.type == "getUrls"){
getUrls(request, sender, sendResponse)
}
});
function getUrls(request, sender, sendResponse){
var resp = sendResponse;
$.ajax({
url: "http://localhost:3000/urls",
method: 'GET',
success: function(d){
resp({urls: d})
}
});
}
Wenn ich nun die Antwort vor dem Ajax-Aufruf in der getUrls
Funktion sende , wird die Antwort erfolgreich gesendet, aber in der Erfolgsmethode des Ajax-Aufrufs, wenn ich die Antwort sende, wird sie nicht gesendet. Wenn ich mit dem Debuggen beginne, kann ich das sehen Der Port ist innerhalb des sendResponse
Funktionscodes null .
Antworten:
Aus der Dokumentation für
chrome.runtime.onMessage.addListener
:Sie müssen also nur
return true;
nach dem Aufruf hinzufügen ,getUrls
um anzuzeigen, dass Sie die Antwortfunktion asynchron aufrufen.quelle
<blink>
und<marquee>
irgendwo auf der Seite markiert sein.Die akzeptierte Antwort ist richtig. Ich wollte nur Beispielcode hinzufügen, der dies vereinfacht. Das Problem ist, dass die API (meiner Ansicht nach) nicht gut gestaltet ist, da sie uns Entwickler dazu zwingt, zu wissen, ob eine bestimmte Nachricht asynchron behandelt wird oder nicht. Wenn Sie viele verschiedene Nachrichten verarbeiten, wird dies zu einer unmöglichen Aufgabe, da Sie nie wissen, ob eine übergebene sendResponse in einer bestimmten Funktion als asynchron bezeichnet wird oder nicht. Bedenken Sie:
Wie kann ich wissen, ob
handleMethod1
der Anruf tief im Inneren asynchron ist oder nicht? Wie kann jemand, der ÄnderungenhandleMethod1
vornimmt, wissen, dass er einen Anrufer durch die Einführung von etwas Asynchronem unterbricht?Meine Lösung lautet:
Dadurch wird der Rückgabewert automatisch verarbeitet, unabhängig davon, wie Sie die Nachricht behandeln. Beachten Sie, dass dies voraussetzt, dass Sie nie vergessen, die Antwortfunktion aufzurufen. Beachten Sie auch, dass Chrom dies für uns hätte automatisieren können. Ich verstehe nicht, warum dies nicht der Fall war.
quelle
chrome.extension.onRequest
/chrome.exension.sendRequest
Methoden verhalten sich genau so, wie Sie es beschreiben. Diese Methoden sind veraltet, da sich herausstellt, dass viele Erweiterungsentwickler den Nachrichtenport NICHT geschlossen haben. Die aktuelle API (erforderlichreturn true
) ist ein besseres Design, da ein hartes Versagen besser ist als ein leises Auslaufen.return true;
. Es verhindert nicht, dass der Port bereinigt wird, wenn der Anruf synchronisiert wird, während asynchrone Anrufe weiterhin korrekt verarbeitet werden. Der Code in dieser Antwort führt zu unnötiger Komplexität ohne offensichtlichen Nutzen.Sie können meine Bibliothek https://github.com/lawlietmester/webextension verwenden , damit dies sowohl in Chrome als auch in FF mit Firefox ohne Rückruf funktioniert.
Ihr Code sieht folgendermaßen aus:
quelle