Un paquete que usamos a menudo en Node.js son los eventos. Podemos ver que el EventEmitter de este paquete se usa en muchos lugares. Según este mecanismo de eventos, podemos hacer las cosas apropiadas cuando llega el nuevo número apropiado.
Este mecanismo es muy adecuado para escenarios como red IO, lectura y escritura de archivos y tareas asincrónicas.
Por ejemplo el siguiente código
const events = require('events');
events.captureRejections = true;
const ee1 = new events.EventEmitter();
ee1.on('something', async (value) => {
throw new Error('kaboom');
});
ee1.on('error', console.log);
El complemento C ++ usa EventEmmitter
Al exponer el método EventEmitter.emit al complemento, la devolución de llamada js se puede implementar en el complemento. El siguiente código asumimos
Compílelo en addon.node En cuanto a compilar el complemento, tengo un método detallado en el artículo anterior.
#include <napi.h>
#include <chrono>
#include <iostream>
#include <thread>
Napi::Value CallEmit(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
Napi::Function emit = info[0].As<Napi::Function>();
emit.Call({Napi::String::New(env, "start")});
for (int i = 0; i < 5; i++) {
std::this_thread::sleep_for(std::chrono::seconds(1));
emit.Call(
{Napi::String::New(env, "data"), Napi::String::New(env, "data ...")});
}
emit.Call({Napi::String::New(env, "end")});
return Napi::String::New(env, "OK");
}
// Init
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "callEmit"),
Napi::Function::New(env, CallEmit));
return exports;
}
NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init);
código de llamada js
const EventEmitter = require('events').EventEmitter
const addon = require('bindings')('addon.node')
const emitter = new EventEmitter()
emitter.on('start', () => {
console.log('### START ...')
})
emitter.on('data', (evt) => {
console.log(evt);
})
emitter.on('end', () => {
console.log('### END ###')
})
addon.callEmit(emitter.emit.bind(emitter))
La salida es la siguiente