Ich habe eine Funktion, die ich auf der Seite ausführen möchte, indem ich chrome.tabs.executeScript
benutze, das von einem Browser-Aktions-Popup läuft. Die Berechtigungen korrekt eingerichtet sind und es funktioniert gut mit einem synchronen Rückruf:Verwenden von chrome.tabs.executeScript zum Ausführen einer asynchronen Funktion
chrome.tabs.executeScript(
tab.id,
{ code: `(function() {
// Do lots of things
return true;
})()` },
r => console.log(r[0])); // Logs true
Das Problem ist, dass die Funktion, die ich durchläuft mehrere Rückrufe nennen wollen, so will ich async
und await
verwenden:
chrome.tabs.executeScript(
tab.id,
{ code: `(async function() {
// Do lots of things with await
return true;
})()` },
async r => {
console.log(r); // Logs array with single value [Object]
console.log(await r[0]); // Logs empty Object {}
});
Das Problem ist, dass das Rückrufergebnis r
. Es sollte ein Array von Skript-Ergebnissen sein, also erwarte ich, dass r[0]
ein Versprechen ist, das verrechnet wird, wenn das Skript beendet ist.
Die Promise-Syntax (mit) funktioniert auch nicht.
Wenn ich die exakt gleiche Funktion auf der Seite ausführen, gibt es ein Versprechen wie erwartet zurück und kann erwartet werden.
Irgendeine Idee, was ich falsch mache und gibt es einen Weg um es herum?
Es wäre interessant gewesen wenn das funktioniert hätte, aber das hätte ich nicht erwartet. Der Code im Inhaltsskript und der Code im Hintergrundkontext (Popup) laufen in völlig getrennten Prozessen ab. Ich wäre überrascht gewesen, wenn es gelänge, eine Antwort von einem asynchronen Inhaltsskript zu erwarten. Sie müssen [Message Passing] (https://developer.chrome.com/extensions/messaging) verwenden. – Makyen
async/await ist nur ein syntaktischer Zucker, der das Event-Loop-basierte Verhalten der js-Engine nicht verändert, so dass es nicht funktioniert. – wOxxOm
In Firefox Web Extensions gibt 'chrome.tabs.executeScript' ein Versprechen zurück, und gemäß der MDN-Dokumentation ist dies kompatibel mit der Funktionsweise von Chrome. Ich habe diesbezüglich jedoch keine brauchbare Chrome-Dokumentation gefunden, aber möglicherweise etwas zu beachten –