2016-04-07 10 views
0

In meiner Erweiterung verbinden sich verschiedene Inhaltsskripte mit background.js, um miteinander zu kommunizieren. Das Problem, das ich habe, ist, dass ich, wenn ich eine Nachricht an einem Port empfange, diese Informationen nicht an den anderen Port weiterleiten kann. Der Fehler Ich erhalte ist:Chrome-Erweiterung - Messaging mit mehreren Ports

Error: Attempting to use a disconnected port object 

Mein Code in background.js

chrome.runtime.onConnect.addListener(function(port) { 
    if(port.name === "menuport") { 
    port.onMessage.addListener(function(msg) { 
     console.log('BGJS from menuport') 
     console.log(msg) 
     var page_port = chrome.runtime.connect({name: "pageport"}); 
     page_port.postMessage(msg); 
    }); 
    } else if (port.name === "pageport") { 
    port.onMessage.addListener(function(msg) { 
     console.log('BGJS from pageport') 
     console.log(msg) 
    }); 
    } 
}); 

Der pageport in content.js aktiviert wird:

var page_port = chrome.runtime.connect({name: "pageport"}); 
page_port.postMessage({source: "page", status: "ready"}); 
page_port.onMessage.addListener(function(msg) { 
    console.log(msg) 
}); 

Der menuport arbeitet mit einem ähnlichen Skript. Die Aktivierung beider Ports funktioniert, ich kann in der Konsole sehen. Ich kann jedoch keine Nachricht von background.js an einen Port senden.

Antwort

1

Wenn Sie in background.js den onConnect-Rückruf empfangen, müssen Sie diesen Port als Variable speichern, damit Sie ihn später wiederverwenden können. Ich sehe, dass Sie die Portvariable unter dem port.name == "pageport" verwerfen, was verursacht, dass es Garbage Collected (und getrennt) ist. Speichern Sie es als window.page_port.

Ich denke, Sie versuchen, von beiden Seiten zu verbinden, was keinen Sinn macht.

Eine Seite verbindet, die andere wartet auf das Ereignis onConnect.

+0

Perfekt, löste es. Vielen Dank! – Vincent

+0

@Vincent ist nicht die Portvariable, die bereits im Funktionskontext gespeichert wurde? Seltsam, dass es funktioniert hat. – user5858

+0

Es ist an einem Ende gespeichert, aber nicht auf der anderen Seite. Da ich mit mehreren Ports pro Seite arbeite, verwende ich den Namen, um sie zu identifizieren. – Vincent