9

Sto trasferendo una pila di codice C++ in Javascript utilizzando il sistema Emscripten. Il codice C++ ha molte chiamate a fopen che è una chiamata IO sincrona. All'interno di Emscripten, simuliamo questo utilizzando una richiesta XHR a una risorsa locale tuttavia, all'interno di chiamate sincrone XHR di Firefox (con uno responseType di blob o arraybuffer) sono supportati solo all'interno di un Web-Worker. Convertire tutto il codice C++ per adattarlo al codice IO asincrono sembra molto complicato, quindi per il mio primo tentativo, vorrei vedere se riesco a simulare una richiesta XHR sincrona.C'è un modo per simulare una richiesta XHR sincrona?

Il mio pensiero iniziale era che il ciclo principale potrebbe condividere alcune Stato con un web-operaio che potrebbe rendere la chiamata io sincrono e aggiornare lo stato condiviso durante il ciclo principale si fermò e attese per il web-operaio finito. NOTA BENE: So che questo non è il modo tipico di Javascript, ma sto eseguendo il porting del codice sincrono, non scrivendo il nuovo codice da zero (nel quale avrei sicuramente utilizzato l'IO asincrono).

Considerate le restrizioni sullo stato di condivisione tra un web worker e il ciclo principale, questa idea sembra insostenibile.

Ci sono altri modi per farlo?

+0

* "all'interno di Firefox chiamate XHR sincrone sono supportati solo all'interno di un Web-Worker" * Che certo non suona bene. –

+0

Questo è dove sto ottenendo questa info: https://github.com/kripken/emscripten/wiki/Filesystem-Guide "ATTENZIONE: Firefox e Chrome hanno recentemente disabili sincrone XHR binari, il che significa che questo non può funzionare " –

+2

@squint L'OP non ha spiegato bene (fino a quando il suo commento sopra), ma è ulteriormente spiegato sulla [pagina XHR] di MDN (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest) : "A partire da Gecko 11.0 ... oltre al build 528 di WebKit, questi browser non ti consentono più di utilizzare l'attributo' responseType' quando si eseguono richieste sincrone. " Ciò significa che non puoi recuperare i dati binari usando un 'responseType' di" 'arraybuffer'" o "' blob' "; questo è stato fatto (presumo) per scoraggiare esplicitamente il recupero di risorse binarie (potenzialmente piuttosto grandi) in modo sincrono. – apsillers

risposta