如何使用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
相关产品推荐
相关产品推荐

