You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Emscripten从C++调用JS异步方法时处理Promise

你可以直接操作调用后返回的emscripten::val类型的Promise实例,通过Emscripten封装的then和catch_方法绑定回调即可,和JS的写法逻辑完全对应。

完整实现代码

首先引入必要的头文件:

#include <emscripten/val.h>
using namespace emscripten;

调用逻辑如下:

// 调用JS异步方法得到Promise对象
val add_promise = val::global("Add")(5, 5);

add_promise
  // 绑定成功回调,对应JS的then
  .then([](val result) {
    // 将JS返回的数值转为C++的int类型
    int calc_result = result.as<int>();
    // 此处替换为你自己的业务处理逻辑
    printf("计算结果:%d\n", calc_result);
  })
  // 绑定异常回调,对应JS的catch
  // 注意Emscripten里命名为catch_,因为catch是C++的关键字,无法直接作为方法名
  .catch_([](val error) {
    // 提取JS异常的错误信息转为C++字符串
    std::string err_msg = error["message"].as<std::string>();
    // 此处替换为你自己的异常处理逻辑
    printf("调用出错:%s\n", err_msg.c_str());
  });

注意事项

  • 如果你在回调lambda中需要捕获外部变量,异步执行场景下不要捕获栈上的临时变量,避免出现悬垂引用问题,必要时可以用std::shared_ptr包装需要捕获的动态数据。
  • 如果你需要同步等待Promise返回结果,可以配合Emscripten的C++协程支持使用await语法,但不要在主线程做同步阻塞操作,否则会导致页面无响应。

内容的提问来源于stack exchange,提问作者Vishwas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:45:03