我正在使用emscripten编译一个C程序,该程序使用我编写的JavaScript库,并且我将它们与--js-library
标志链接在一起。我的C代码调用库中的一个函数,其中包含Promise
,并且在回调中我希望它将给定的结果写入已经从C调用者传递到JS函数的某个内存中。这是一个例子(为了简洁,我省略了Promise的错误捕获catch
部分):
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]);
}
在没有Promise的其他函数中,我已经为库编写了这些函数,我已经能够成功地将数据写入C代码给出的缓冲区,但这次输出如下:
Calling Javascript
0
0
Promise Returned fully
但我希望能够等待Promise的结果然后将其写入C代码,以便Promise Returned Fully
出现在C代码中的printf
语句之后JavaScript调用。有没有办法用emscripten做到这一点?
答案 0 :(得分:1)
使用ASYNCIFY_FUNCTIONS
和_emscripten_async_resume
。
https://kripken.github.io/emscripten-site/docs/porting/asyncify.html