Передача функции JS в функцию C emscripten

#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 для правильного решения!