9

Ich portiere einen Stapel C++ - Code mit dem Emscripten-System nach Javascript. Der C++ - Code hat viele Aufrufe an fopen, bei dem es sich um einen synchronen IO-Aufruf handelt. Innerhalb von Emscripten simulieren wir dies mit einer XHR-Anfrage an eine lokale Ressource aber, innerhalb Firefox werden synchrone XHR-Aufrufe (mit einem responseType von blob oder arraybuffer) nur innerhalb eines Web-Worker unterstützt. Das Konvertieren des gesamten C++ - Codes zur Anpassung an asynchronen IO-Code scheint sehr kompliziert zu sein. Daher möchte ich bei meinem ersten Versuch sehen, ob ich eine synchrone XHR-Anfrage fälschen kann.Gibt es eine Möglichkeit, eine synchrone XHR-Anfrage zu fälschen?

Mein erster Gedanke war, dass die Hauptschleife einen Status mit einem Web-Mitarbeiter teilen könnte, der den synchronen io-Aufruf durchführen und den gemeinsamen Status aktualisieren konnte, während die Hauptschleife pausierte und auf den Web-Worker wartete. HAFTUNGSAUSSCHLUSS: Ich weiß, dass dies nicht der typische Javascript-Weg ist, aber ich portiere synchronen Code, schreibe keinen neuen Code von Grund auf (in dem ich definitiv asynchrone IO verwendet hätte).

Angesichts der Einschränkungen der Freigabe von Status zwischen einem Web-Worker und der Hauptschleife, scheint diese Idee unhaltbar.

Gibt es andere Möglichkeiten, dies zu tun?

+0

* "im Firefox synchron XHR Anrufe werden nur innerhalb eines Web-Worker unterstützt" * Das ist sicher nicht richtig klingen. –

+0

Dies ist, wo ich diese Informationen bin immer: https://github.com/kripken/emscripten/wiki/Filesystem-Guide „WARNING: Firefox und Chrome haben kürzlich deaktiviert synchronen binären XHRs, was bedeutet dies nicht funktionieren kann " –

+2

@squint Das OP hat es nicht gut erklärt (bis zu seinem Kommentar oben), aber es wird weiter erklärt auf MDNs [XHR-Seite] (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest) : "Ab Gecko 11.0 ... sowie WebKit Build 528 können diese Browser das Attribut" responseType "nicht mehr verwenden, wenn synchrone Anfragen ausgeführt werden." Das heißt, Sie können keine Binärdaten mit einem 'responseType' von' 'arraybuffer' 'oder'' blob' zurückholen; Dies wird (wie ich annehme) so gemacht, dass das Abrufen von (potentiell ziemlich großen) binären Ressourcen auf synchrone Weise ausdrücklich verhindert wird. – apsillers

Antwort

2

So, nachdem alle Antworten zu sehen und einige meiner eigenen Lektüre zu tun, scheint es die beste Antwort ist: " Sie können, aber nur für Textdaten und Sie müssen es zurück in Binärdaten konvertieren ". Das ist langsam, aber funktioniert.

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data?redirectlocale=en-US&redirectslug=DOM%2FXMLHttpRequest%2FSending_and_Receiving_Binary_Data#Receiving_binary_data_in_older_browsers

Verwandte Themen