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

Posted UsherYue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js插件编写-插件代码通过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 <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);

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

输出结果如下

 

以上是关于Node.js插件编写-插件代码通过Emit与js代码进行交互的主要内容,如果未能解决你的问题,请参考以下文章

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

Node.js插件编写-函数工厂与对象工厂的实现

Node.js插件编写-函数工厂与对象工厂的实现

Node.js插件编写-函数工厂与对象工厂的实现

Node.js插件编写-函数工厂与对象工厂的实现

Node.js插件编写-通过NAN编写简单插件入门