Escritura del complemento Node.js (8): el código del complemento interactúa con el código js a través de Emit

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

 

Supongo que te gusta

Origin blog.csdn.net/yue7603835/article/details/122347380
Recomendado
Clasificación