javascript - 嵌入传递 lambda 函数作为回调参数

标签 javascript c++ lambda emscripten

我想创建一个函数来计算一些东西。完成后调用回调函数。

void calculate(int param1, ..., std::function<void(void)> callback) {
    //code...
    callback();
}

函数的绑定(bind)是使用 Embind 创建的:

EMSCRIPTEN_BINDINGS(my_module) {
    function("calculate", &calculate);
}

但如果我尝试调用 Module.calculate(0, ..., function(){/*...*/}),我会收到此错误:

UnboundTypeError: Cannot call calculate due to unbound types: NSt3__18functionIFvvEEE

最佳答案

我不确定这是否是唯一的方法,但是为了从 Js -> C++ 传递回调,我不得不

  • 不使用std::function,而是原始函数指针
  • 使用Runtime.addFunction获取 Javascript 函数的 C++ 函数指针,并将其传递到 C++ 世界,而不是尝试直接传递 Javascript 函数。
  • 不使用 EMBIND,而是使用 cwrap/ccall API .

对于您的示例,稍微简化接口(interface)以便仅从 JS -> C++ 传递回调,C++ 可能如下所示:

extern "C" {

EMSCRIPTEN_KEEPALIVE
void calculate(void (*callback)()) {
  callback();
}

}

创建回调函数指针的 Javascript 看起来像

var callbackPointer = Module.Runtime.addFunction(function() {
  console.log('In the callback');
});

并调用函数,传递指针(作为“数字”):

Module.ccall('calculate', 'number', ['number'], [callbackPointer]);

然后编译确保为函数指针预留空间:

em++ app.cpp -s RESERVED_FUNCTION_POINTERS=1 -o app.js

关于javascript - 嵌入传递 lambda 函数作为回调参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36371178/

相关文章:

javascript - 变量作为 JavaScript 对象文字中的属性名称?

javascript - 异步等待返回未定义的javascript

c++ - CUDA 7.5 Visual Studio 2013 崩溃

c# - lambda 表达式的对象初始化器/构造函数自引用

android - 是否可以将 lambda 传递给 Intent?

python - 由于使用 "lambda",无法加载保存的 Keras 模型

javascript - 将忽略时区偏移的日期字符串

javascript - Grafana,使用外部库开发插件

C++:需要一个声明

c++ - gcc/mingw 中 'startup files' 的来源