栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

输出结果如下

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/698580.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号