es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo manejar las promesas al llamar un método asincrónico de JS desde C++ usando Emscripten.

Tengo un método asíncrono de JS algo como

async Add(_a: number, _b: number): Promise<number> {
    return _a + _b
}

window.Add = Add

Normalmente, si llamara a esta función desde JS, haría algo como

Add(5, 5).then((_result) => {
    console.log(_result)
}).catch((error) => {
    console.log(error)
})

¿Cómo puedo lograr este mismo comportamiento de manejar la promesa al llamar esta función asíncrona de JS desde C++?

Actualmente, estoy haciendo algo como esto para llamar a la función de JS desde C++

emscripten::val::global("Add").operator()(5, 5);
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el mismo comportamiento de manejo de la promesa al llamar esta función async de JS desde C++, se pueden usar las palabras clave async y await en C++.

    En primer lugar, incluya el archivo de encabezado <future> en su código C++. Luego, defina un futuro con std::async, especificando emscripten::val::global como la función a llamar y pasando sus argumentos.

    Aquí hay un ejemplo:

    #include <future>
    #include <emscripten bind.h="">
    
    emscripten::val Add = emscripten::val::undefined();
    
    int main() {
        Add = emscripten::val::global("Add");
        auto future = std::async(
            std::launch::async, 
            [](int a, int b) { return Add(a, b); }, 
            5, 5
        );
    
        try {
            auto result = future.get();
            std::cout << result.as<int>() << std::endl;
        } catch (const emscripten::exception& ex) {
            std::cout << ex.what() << std::endl;
        }
    }
    

    En este ejemplo, primero obtenemos una referencia a la función Add desde el ámbito global usando emscripten::val::global. Luego definimos un futuro usando std::async, especificando una lambda que llama a Add con los dos argumentos.

    Para recuperar el resultado de la llamada async, llamamos a future.get(), lo que bloqueará hasta que el futuro esté listo y devolverá el resultado.

    Tenga en cuenta que capturamos excepciones de tipo emscripten::exception ya que pueden ser arrojadas si hubo un problema con la llamada async.

Comments are closed.