我正在使用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')}}}
       }
  });
}

程式
#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]);
}

在没有为库编写的Promises的其他函数中,我已经能够成功地将数据写入C代码给定的缓冲区中,但是这次,输出返回如下:
Calling Javascript
0
0
Promise Returned fully

但是我希望能够等待Promise的结果,然后将其写入C代码,以便Promise Returned Fully在C代码中的printf语句之前,在JavaScript调用之后。有没有办法用emscripten做到这一点?

最佳答案

使用ASYNCIFY_FUNCTIONS_emscripten_async_resume

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

10-07 12:53