9

Przenoszę stos kodu C++ do JavaScript za pomocą systemu Emscripten. Kod C++ ma wiele wywołań do fopen, który jest synchronicznym wywołaniem IO. W Emscripten symulujemy to za pomocą żądania XHR do lokalnego zasobu , jednak, w ramach synchronicznych wywołań XHR Firefoksa (z responseType z blob lub arraybuffer) są obsługiwane tylko w Web-Worker. Konwertowanie całego kodu C++ w celu adaptacji do asynchronicznego kodu IO wydaje się bardzo skomplikowane, więc przy pierwszej próbie chciałbym sprawdzić, czy mogę sfałszować synchroniczne żądanie XHR.Czy istnieje sposób na sfałszowanie synchronicznego żądania XHR?

Początkowo sądziłem, że główna pętla może współdzielić jakiś stan z robotem sieciowym, który może wykonać wywołanie synchroniczne io zaktualizować stan współdzielony, podczas gdy pętla główna jest wstrzymana i czekał na zakończenie pracy przez web-worker. OŚWIADCZENIE: Wiem, że to nie jest typowy sposób JavaScript, ale ja przesyłam kod synchroniczny, nie pisząc nowego kodu od zera (w którym zdecydowanie używałbym asynchronicznego IO).

Biorąc pod uwagę ograniczenia dotyczące współdzielenia stanu między web-worker i main-loop, ten pomysł wygląda na nie do utrzymania.

Czy są na to inne sposoby?

+0

* „w Firefox połączeń synchronicznych XHR są obsługiwane tylko w Web-pracownik” * To na pewno nie brzmi dobrze. –

+0

To gdzie ja dostaję tę informację: https://github.com/kripken/emscripten/wiki/Filesystem-Guide „UWAGA: Firefox i Chrome mieć niedawno niepełnosprawnych synchronicznych XHRs binarnych, co oznacza, że ​​nie może pracować " –

+2

@ squint OP nie wyjaśnił tego dobrze (aż do powyższego komentarza), ale jest dalej wyjaśniony na stronie [XHR MDN] (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest) : "Począwszy od wersji Gecko 11.0 ... oraz WebKit 528, te przeglądarki nie pozwalają już używać atrybutu' responseType' podczas wykonywania synchronicznych żądań. " Oznacza to, że nie można odzyskać danych binarnych za pomocą 'responseType' of" 'arraybuffer'" lub "' blob' "; robi się to (zakładam), by wyraźnie zniechęcić do pobierania (potencjalnie całkiem dużych) zasobów binarnych w sposób synchroniczny. – apsillers

Odpowiedz

2

Więc po obejrzeniu wszystkich odpowiedzi i robi jedne z własnego czytania, wydaje się, że najlepszą odpowiedzią jest: " Możesz, ale tylko dla danych tekstowych i musisz przekonwertować je z powrotem na dane binarne ". Jest to powolne, ale działa.

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

Powiązane problemy