#javascript #c #webassembly #emscripten
Вопрос:
У меня есть функция с такой подписью :
void generate_effect(const std::stringamp; file_name, const std::stringamp; out_dir) {
...
...
}
и обязательные, такие как:
EMSCRIPTEN_BINDINGS(main)
{
function("generateEffect", amp;generate_effect);
}
поэтому в JS я называю это так:
const object = await Module()
object.generateEffect("file_name", "out_dir");
Это прекрасно работает
Но мне нужно сделать что-то вроде этого:
object.generateEffect("file_name", "out_dir", function callback(success, msg) {
if(success) ...
else ...
});
Проблема в том, что я пробовал разные способы передачи обратного вызова функции C , но они не работали для меня, я пробовал:
void generate_effect(const std::stringamp; file_name, const std::stringamp; out_dir,
emscripten::val callback) // works only when callback has no args
void generate_effect(const std::stringamp; file_name, const std::stringamp; out_dir,
void(*callback)(bool, const char*)) // i must not use raw pointers
Я думал об optional_override, и я думаю, что мои привязки должны выглядеть так:
function(
"generateEffect",
optional_override(
[](manageramp; this_, const valamp; error) {
this_.add_error_listener(
make_error_listener(
[error](const std::stringamp; name, const std::stringamp; message) {
error(name, message);
}));
}))
Я понятия не имею, как передать обратный вызов с двумя парами функции C в emscripten, я буду рад любой помощи !
Комментарии:
1. Если вы не получили ответа. попробуйте reddit cpp_questions
2. Я не думаю, что Embind в настоящее время поддерживает типы замыканий привязки. Однако вы можете создать класс, сохранить лямбда-код в качестве его свойства и предоставить
invoke()
метод для этого класса, который может быть связан с помощью Embind и доступен для JS. Это не идеально, но может дать вам обходной путь на данный момент. Пожалуйста, поднимите запрос на функцию в репозитории Emscripten для правильного решения!