详解nodejs addon实现回调函数事件

 更新时间:2026年02月08日 15:29:53   作者:Aaron_1127  
本文介绍了一个Node.js addon的实现,通过封装异步回调接口,使用libuv和nan模块处理从C++到JavaScript的回调,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

封装nodejs的addon接口,在处理回调函数这块走了很多弯路,在此提供一个简单的测试程序,有兴趣的可以研究下。

安装nan模块

npm install nan

binding.gyp文件内容如下:

{
    'targets': [
    {
        "target_name": "bjcast_project_addon", 
        "sources": ["./bjcast_project_addon.cc"],
        
        "include_dirs": [
            "<!(node -e \"require('nan')\")",
        ],            
    }
    ]  
}

bjcast_project_addon.cc内容如下:

#include <iostream>
#include <string>

#include <v8.h>
#include <nan.h>
#include<windows.h>
using namespace v8;

struct OnStartSessionData {
  Nan::Callback *callback;    //回调函数
  int reason;                 //需要回调到js层的数据
  uv_async_t handle;          //异步句柄
};

OnStartSessionData *on_start_session_data = new OnStartSessionData();

static void OnBJCastStartSession(const int reason) {    
  on_start_session_data->reason = reason;
  on_start_session_data->handle.data = (void *)on_start_session_data; //数据类型的一些转换
  uv_async_send(&on_start_session_data->handle);                      //唤醒事件循环中的事件  
}

void OnStartSessionEvent(uv_async_t *handle) {                  //具体执行的事件
  Nan::HandleScope scope;
  OnStartSessionData *data = (OnStartSessionData *)handle->data;
  v8::Local<v8::Value> argv[1] = {Nan::New((int)data->reason)};//数据类型的一些转换
  data->callback->Call(1, argv);                               //数据回调到js层
}

NAN_METHOD(bjcast_session) {
  Local<String> ip_value = Local<String>::Cast(info[0]);
  String::Utf8Value ip(ip_value);
  std::string ip_str = std::string(*ip);

  Local<Number> port_value = Local<Number>::Cast(info[1]);
  double port = port_value->NumberValue();

  Local<String> pin_value = Local<String>::Cast(info[2]);
  String::Utf8Value pin(pin_value);
  std::string pin_str = std::string(*pin);

  Nan::Callback *start_session_callback = new Nan::Callback(info[3].As<Function>());
   
  on_start_session_data->callback = start_session_callback;  //获取回调函数 
  uv_async_init(uv_default_loop(), &on_start_session_data->handle,OnStartSessionEvent);  //加入事件循环中,等待唤醒,uv_default_loop()获取libuv默认创建的事件循环句柄

//   int32_t value = BJCastProjectLib::GetInstance().StartBJCastSession(
//       ip_str.c_str(), (uint16_t)port, pin_str.c_str(),start_session_callback);
  
  int value = 0;
  Local<Value> argv[1] = {Nan::New((int)value)};
  info.GetReturnValue().Set(Nan::New((int)value));

  OnBJCastStartSession(5);   
}


NAN_MODULE_INIT(init) {
  Nan::Export(target, "startBJCastSession", bjcast_session);
}

NODE_MODULE(bjcast_project_addon_win, init)

index.js的内容如下:

var BJLib = require('./build/Release/bjcast_project_addon.node');

var serverIp = '192.168.9.155';
var serverPort = 8188;
var pin = '';


onStartSessionResult =function(result) {  
  console.log('result =  ', result);
}

var ret_value = BJLib.startBJCastSession(
    serverIp, serverPort, pin, onStartSessionResult);  

console.log(ret_value);

运行

node index.js
0
result =   5

到此这篇关于详解nodejs addon实现回调函数事件的文章就介绍到这了,更多相关nodejs addon 回调内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nvm安装使用及常用命令

    nvm安装使用及常用命令

    nvm主要是用来管理 nodejs 和 npm 版本的工具,可以用来切换不同版本的 nodejs,这篇文章主要介绍了nvm安装与使用,需要的朋友可以参考下
    2023-01-01
  • 使用Typescript和ES模块发布Node模块的方法

    使用Typescript和ES模块发布Node模块的方法

    这篇文章主要介绍了使用Typescript和ES模块发布Node模块的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • npm使用的环境变量及其用法解读

    npm使用的环境变量及其用法解读

    这篇文章主要介绍了npm使用的环境变量及其用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-10-10
  • node.js接口复习及使用案例解析

    node.js接口复习及使用案例解析

    这篇文章主要为大家介绍了node.js接口的复习及使用案例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 详解Windows下安装Nodejs步骤

    详解Windows下安装Nodejs步骤

    本篇文章主要介绍了详解Windows下安装Nodejs步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Node.js API详解之 os模块用法实例分析

    Node.js API详解之 os模块用法实例分析

    这篇文章主要介绍了Node.js API详解之 os模块用法,结合实例形式分析了Node.js API中os模块基本功能、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • 深入浅出了解Node.js Streams

    深入浅出了解Node.js Streams

    这篇文章讲了了解流的用途,为什么它们如此重要,以及如何使用它们。下面我们来一起学习吧
    2019-05-05
  • nodejs调用cmd命令实现复制目录

    nodejs调用cmd命令实现复制目录

    本文给大家介绍的是如何在nodejs中调用CMD命令,从而实现目录的复制,非常的实用,有需要的小伙伴可以参考下。
    2015-05-05
  • 详解express与koa中间件模式对比

    详解express与koa中间件模式对比

    本篇文章主要介绍了详解express与koa中间件模式对比,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • nodejs学习笔记之路由

    nodejs学习笔记之路由

    因为只是用于本地服务器用于自己测试用,所以不需要太完善的路由功能,所以也就不去使用express框架,而是自己实现一个简易路由,可以针对自己的需求来定制路由功能。
    2017-03-03

最新评论