2017-02-12 24 views
4

Я использую emscripten для компиляции программы на C, которая использует написанную мной библиотеку JavaScript, и я связываю их вместе с флагом --js-library. Мой C-код вызывает функцию в библиотеке, в которой есть Promise, а в обратном вызове я хочу, чтобы он записывал данный результат в некоторую память, которая была передана в функцию JS от вызывающего C. Ниже приведен пример (я опустил ошибки выделяющегося catch части Promise для краткости):async javascript library call from C code заканчивается слишком поздно

lib.js

mergeInto(LibraryManager.library, { 
    compute_js: function(input, out_buf) { 
    do_promise_computation(
     input 
    ).then(function(result){ 
     Module.print("Promise Returned fully"); 
     for (var i = 0; i < 8; i++) { 
     var num = result[i] 
     {{{makeSetValue('out_buf+(i*4)', 0, 'num', 'i32')}}} 
     } 
    }); 
} 

program.c

#include <stdio.h> 
#include <stdint.h> 
#include <emscripten.h> 

extern void compute_js(int32_t, int64_t*); 

int main() { 
    int32_t input = 1234; 
    int64_t out_buf[4]; 
    int64_t* out_ptr = (int64_t*)(&out_buf); 
    printf("Calling Javascript\n"); 
    compute_js(input, out_ptr); 
    printf("%lld\n", out_buf[0]); 
    printf("%lld\n", out_buf[1]); 
} 

В других функциях, без Обещаний , который я написал для библиотеки, я смог успешно записать данные в буфер, указанный в коде C, но на этот раз выход возвращается следующим образом:

Calling Javascript 
0 
0 
Promise Returned fully 

Но я хочу, чтобы ждать результата от Promise, а затем записать его в код C, так что Promise Returned Fully приходит перед операторами printf в коде C, который после вызова JavaScript. Есть ли способ сделать это с помощью emscripten?

+0

Я не слишком хорошо знаком с emscripten, я боюсь, но мой друг, который спрашивает, если вы можете использовать семафор, он должен решить вашу проблему. –

+0

Я не знаю этой среды, но можете ли вы, чтобы ваш Javascript вызывал функцию обратного вызова в вашем коде C из обработчика '.then()'? – jfriend00

ответ

1

Использование ASYNCIFY_FUNCTIONS и _emscripten_async_resume.

https://kripken.github.io/emscripten-site/docs/porting/asyncify.html

+0

Я пробовал это, но даже после выполнения всего, что было сказано, я получал ошибки. А именно, я не уверен, где вызывать '_emscripten_async_resume()'. Если я назову его на C, он говорит, что это «неявное объявление» функции и не разрешено. Если я назову это в JS, мне сказали: «ReferenceError: ___async не определен». И я компилирую свой код с помощью -s ASYNCIFy = 1 -s ASINCIFY_FUNCTIONS = ['compute_js_helper'] '(вспомогательная функция является функцией C, которая обертывает вызов функции JS). –