Emscripten Fetch всегда возвращает 0 - PullRequest
1 голос
/ 22 марта 2019

Я следую примеру синхронной выборки, который поставляется с Emscripten следующим образом:

void main()
{
      emscripten_fetch_attr_t attr;
      emscripten_fetch_attr_init(&attr);
      strcpy(attr.requestMethod, "GET");
      attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY | EMSCRIPTEN_FETCH_SYNCHRONOUS;
      emscripten_fetch_t *fetch = emscripten_fetch(&attr, "https://ichef.bbci.co.uk/news/660/cpsprodpb/E9DF/production/_96317895_gettyimages-164067218.jpg");
      printf("Fetch finished with status %d\n", fetch->status);
}

Всегда возвращается 0 из состояния выборки

Я компилирую с

FLAGS            += -std=c++17 -stdlib=libc++ -O3
FLAGS            += -s WASM=1  -s USE_WEBGL2=1 -s FULL_ES3=1 
FLAGS            += -s ALLOW_MEMORY_GROWTH=1 
FLAGS            += -o hello.html 
FLAGS            += -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'cwrap']"    
FLAGS            += --no-heap-copy
FLAGS            +=  -s FETCH=1

Однако, когда я тестирую с асинхронностью и читаю данные внутри функции OnSuccess.Данные печатаются правильно

static
void ondownload_success(emscripten_fetch_t *fetch)
{
    printf("[ download ][ OK ]    %llu bytes  [ URL ]: %s\n", fetch->numBytes, fetch->url);

    printf("%c %c %c", fetch->data[0], fetch->data[3], fetch->data[2] );
    emscripten_fetch_close(fetch); // Free data associated with the fetch.
}

В чем проблема с моим кодом синхронизации Fetch?Все точно так же, как в примере "example_synchronous_fetch.cpp"

Я запускаю на Windows10.Emscripten 1.38.29.Использование Microsoft Edge для просмотра файла напрямую без сервера (двойной щелчок по hello.html)

1 Ответ

1 голос
/ 22 марта 2019

Синхронный fetch имеет некоторые дополнительные ограничения, и кажется, что ваши флаги сборки не включают синхронные fetch:

Синхронные операции Emscripten Fetch подвержены ряду ограничений, в зависимости откакой режим построения Emscripten (флаги компоновщика) используется:

Нет флагов: доступны только асинхронные операции выборки.

–proxy-to-worker: операции синхронной выборки разрешены только для выборок, которые выполняют толькоXHR, но не взаимодействуют с IndexedDB.

-s USE_PTHREADS = 1: синхронные операции выборки доступны в pthreads, но не в основном потоке.

–proxy-to-worker + -s USE_PTHREADS = 1: синхронные операции выборки доступны как в основном потоке, так и в pthreads.

https://emscripten.org/docs/api_reference/fetch.html#synchronous-fetches

...