Node.js插件编写(8)-插件代码通过Emit与js代码进行交互

Node.js插件编写(8)-插件代码通过Emit与js代码进行交互,第1张

Node.js插件编写(8)-插件代码通过Emit与js代码进行交互

我们在Node.js中经常用到的一个包是 events ,这个包下的 EventEmitter我们可以看到很多地方都用到了 , 基于这个事件机制我们可以在合适的新号到来的时候去做合适的事情。

这种机制用在网络IO、文件读写、异步任务等等场景都非常合适。

例如下面的代码
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);
C++插件使用EventEmmitter

通过将EventEmitter.emit 方法暴露给插件,既可以在插件中实现js回调,下面的代码我们假设

编译成addon.node ,至于编译插件我在前面的文章有详细的方法。

#include 
#include 
#include 
#include 

Napi::Value CallEmit(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();
    Napi::Function emit = info[0].As();
    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);

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))

输出结果如下

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5698706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存