Я использую 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?
Я не слишком хорошо знаком с emscripten, я боюсь, но мой друг, который спрашивает, если вы можете использовать семафор, он должен решить вашу проблему. –
Я не знаю этой среды, но можете ли вы, чтобы ваш Javascript вызывал функцию обратного вызова в вашем коде C из обработчика '.then()'? – jfriend00