2012-05-14 9 views
15

Gibt es eine Möglichkeit synchron zu warten oder nach einer neuen Nachricht in einem Web-Worker zu suchen?Synchron auf Nachricht in Web-Worker warten

Ich habe eine große komplizierte Code-Struktur (kompilierte LLVM von emscripten), die ich nicht um Rückrufe umgestalten kann.

Ich muss sicherstellen, dass der Code nach einer bestimmten Zeile nicht ausgeführt wird, bis ich eine Nachricht aus dem UI-Thread erhalte und handle. Wenn ich mit einer while-Schleife blockiere, läuft die Event-Schleife nie, so dass ich keine Nachrichten empfangen kann.

+0

Es würde eine Lösung für Ihr Problem geben, wenn ECMAScript eine Sprache wäre, die so reich ist wie Scheme mit ihrer 'call-with-continuation'. Dies würde es Ihnen ermöglichen, die aktuelle Fortsetzung abzufangen und sie erneut in Ihrem On-Messaging-Handler aufzurufen. – Marc

Antwort

0

Nein, leider. Es gab eine Diskussion über das Hinzufügen einer Möglichkeit, eine Nachricht von der übergeordneten Seite zu blockieren, aber es ging nirgendwohin. Ich werde sehen, ob ich den relevanten Mailinglisten-Thread ausgraben kann.

1

Können Sie die Sequenz wie folgt ohne Refactoring brechen?

wrk.onmessage = function(e) { 
    if (e.data.step === 'initial input') { 
     doInitialWork(e.data.inputs) 
    } else if (e.data.step === 'ui input') { 
     doTheRest(e.data.uiData) 
    } 
} 

Die onmessage Veranstaltung wird, bis der erste Stapel Schritt Ausführung blockiert werden abgeschlossen ist und die kritischen ui Bits wird nur gestartet, wenn und wenn die Informationen zur Verfügung.

0

Ein grober Hack, um dies zu tun, könnte eine synchrone API sein, wie die FileSystem API, und eine temporäre Datei als Synchronisationsmechanismus verwenden.

In Ihrem Beispiel könnte der emscripten-Code eine synchrone Leseoperation für eine Datei ausgeben, während der UI-Thread in die gleiche Datei schreibt und so den Worker effektiv entsperrt.