MessageChannel Die Daten von port.postMessage sind null, wenn postMessage mit einem übertragbaren Objekt aufgerufen wird.

Ich lerne ungefährMessageChannel undübertragbare Gegenstände.

Ich habe einen Iframe, der domänenübergreifend von meiner Seite ist. In der Dokumentation zu MessageChannel wird angegeben, dass die domänenübergreifende Kommunikation vollständig unterstützt wird.

Ich habe diesen Code in meiner domänenübergreifenden Seite in einem iframe:

var messageChannel = new MessageChannel();

//  Transfer port2 to the background page to establish communications.
window.parent.postMessage('connect', 'chrome-extension://jbnkffmindojffecdhbbmekbmkkfpmjd', [messageChannel.port2]);
messageChannel.port1.start();

// Give time for background to setup its port. Not great practice, but OK for example.
setTimeout(function(){ 

    // Create a 32MB "file" and fill it.
    var uInt8Array = new Uint8Array(1024*1024*32); // 32MB
    for (var i = 0; i < uInt8Array.length; ++i) {
        uInt8Array[i] = i;
    }

    messageChannel.port1.onmessage = function(message){
        console.log('iframe message:', message);
    };

    messageChannel.port1.postMessage(uInt8Array.buffer, [uInt8Array.buffer]);

    if (uInt8Array.buffer.byteLength)
        throw "Failed to transfer buffer";

}, 1000);

und auf meiner Hintergrundseite habe ich:

window.onmessage = function(messageEvent) {
    //  Make sure the origin is correct for security
    if (messageEvent.origin === 'https://www.youtube.com') {

        if (messageEvent.ports.length > 0 && messageEvent.data === 'connect') {
            var port = messageEvent.ports[0];

            port.onmessage = function (message) {
                console.log("background message:", message);
            };
        }

    }
};

Wenn ich versuche, eine Nachricht an den uInt8Array-Puffer zu senden, erhalte ich auf der anderen Seite keine Daten:

aber wenn ich versuche, etwas Einfaches zu senden, sag:

messageChannel.port1.postMessage('hello');

dann sehe ich:

Werden die Daten bei der Verwendung übertragbarer Objekte an einer anderen Stelle dargestellt? Ich scheine in der Lage zu sein, den Port zu übertragen, aber ich habe Mühe, das Array von Daten zu übertragen. ABER, da meine Ausnahme nicht geworfen wird - es sieht so aus, als ob sie übertragen wird ... aber wohin ist sie gegangen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage