Llamando a la función de callback de JavaScript desde el código C ++ que produce errores – nbind

Estoy tratando de registrar una función de callback de JavaScript para ser llamada desde una clase de C ++ más adelante. Estoy usando nbind para hacer un addon node.js. Este código de ejemplo lo he escrito de un código más complejo que necesita lograr lo mismo:

El código c ++ (testing.cc):

#include "nbind/api.h" #include  #include  class Test { nbind::cbFunction *callback; public: Test() {} //this dummy var is only here so that doCallback() will be recognized as a function void doCallback(int dummyVar) { std::cout << "Calling Javascript callback" << std::endl; //call javascript code if (callback != nullptr) { (*callback)("Hi there!\n"); } return; } void enrollCallback(nbind::cbFunction &cb) { callback = &cb; return; } }; #include "nbind/nbind.h" NBIND_CLASS(Test) { construct(); method(doCallback); method(enrollCallback); method(unenrollCallback); } 

El código JavaScript (test.js):

 var nbind = require('nbind'); function printMessage(message) { console.log(message); } var lib = nbind.init().lib; var test = lib.Test(); test.enrollCallback(printMessage); try{ test.doCallback(11); } catch(err) { console.log(err); } 

Cuando ejecuto el código anterior en una línea de comando, no obtengo ningún resultado. Cuando ejecuto el código como este: node inspect test.js e ingrese el comando continue, node inspect test.js el siguiente error cuando se llama a la función de callback:

 Error: read ECONNRESET at _errnoException (util.js:992:11) at TCP.onread (net.js:618:25) 

Cuando paso por mi progtwig, recibo el siguiente error en la consola:

 TypeError: test.doCallback is not a function at Object. (C:\Users\mrcole\Desktop\testy\test.js:22:10) at Module._compile (module.js:649:14) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) at Function.Module._load (module.js:497:3) at Function.Module.runMain (module.js:693:10) at startup (bootstrap_node.js:191:16) at bootstrap_node.js:612:3 

¿A dónde me voy mal y por qué el nodo actúa de manera inconsistente?

Para responder a mi propia pregunta, no use nbind para llamar a una función de callback de Node JavaScript de esta manera. Esta es una llamada asíncrona (corríjame si me equivoco) y nbind no admite, a partir de junio de 2018, devoluciones de llamada asíncronas.

Una buena alternativa es implementar una de las clases de AsyncWorker proporcionadas por NAN .

Aquí hay un código de ejemplo:

 class MyAsyncWorker : public Nan::AsyncProgressWorkerBase { public: MyAsyncWorker(Nan::Callback *callback_, const char *resource_name = "My Async Worker") : AsyncProgressWorkerBase(callback_, resource_name) { } ~MyAsyncWorker() { } //Do work, or process notifications here void Execute(const ExecutionProgress &progress) { //do work. when you have something to report, //call ExecutionProgress::Send( T * data, size_t count) to eventually call //the HandleProgressCallback function. } //Call JavaScript callback from this function void HandleProgressCallback(T *data, size_t count) { Nan::HandleScope scope; v8::Local argv[] = { //initialize your data to passback to callback here }; callback->Call(count,argv,async_resource); } //This is called when you are done executing virtual void HandleOKCallback() { Nan::HandleScope scope; v8::Local argv[] = { //Prepare final values to be returned }; callback->Call(1,argv,async_resource); } };