封装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实现回调函数事件相关推荐

  1. nodejs-REPL/回调函数/事件循环

    REPL 回调函数 事件循环REPL----------------------------------------------------- Node.js REPL(Read Eval Print ...

  2. NodeJS学习笔记 —— 回调函数与callback hell

    什么是回调函数 编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是编写库:而应用编程就是利用写好的 ...

  3. nodejs中处理回调函数的异常

    假设是使用nodejs+express3这个经典的组合.那么有一种非常方面的处理回调函数异常的方法: 1. 安装模块:express-domain-middleware 2. 增加例如以下的代码: a ...

  4. setwindowshookex回调函数不执行_ECMAScript 6 入门教程—Generator 函数的异步应用

    作者 | 阮一峰异步编程对 JavaScript 语言太重要.JavaScript 语言的执行环境是"单线程"的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Gener ...

  5. 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)

    回调函数传参:函数指针做函数参数(回调函数) 目录 背景 回调函数是实现函数分层且单向依赖的好办法,使用函数指针运行 struct结构体回调函数代码更清晰 简单理解回调函数 Demo 其他回调函数博文 ...

  6. go 协程回调函数 传入参数_ECMAScript 6 入门教程—Generator 函数的异步应用

    作者 | 阮一峰异步编程对 JavaScript 语言太重要.JavaScript 语言的执行环境是"单线程"的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Gener ...

  7. 彻底搞懂SQLite回调函数查询

    文章目录 一.理解回调函数 1.回调函数流程 2.回调函数实例 3.回调函数方式 二.sqlite3_exec的回调函数 callback 1.先看sqlite3_exec() 2.在看回调callb ...

  8. Node.js —— 回调函数callback

    一.什么是回调函数 1.回调函数是作为参数传递给另一个函数 2.回调函数是一段可执行的代码段,它作为一个参数传递给其他的代码,其作用是在需要的时候方便调用这段(回调函数)代码 3. 函数运行完成,再执 ...

  9. 【NodeJs-5天学习】第一天篇④ ——了解NodeJs回调函数和事件驱动机制

    [NodeJs-5天学习]第一天篇④ --NodeJs回调函数和事件处理机制 1.Node.js 中的回调(Callback)函数 2.Nodejs事件循环模型 2.1 浅析事件驱动 2.2 深入No ...

最新文章

  1. 避免35岁现象,我给技术人的建议永远是架构师!
  2. 不会三种编程语言的不算程序员 走近阿里云 MVP烁淼吐槽大佬
  3. npm run dev 报错echarts
  4. go 数据添加元素和删除特定元素
  5. 可以供MFC调用的,QT实现的DLL(qtwinmigrate实现)
  6. 甲子光年 | 为什么知识图谱终于火了?
  7. python爬虫requests源码链家_python爬虫——爬取链家房价信息(未完待续)
  8. 计算机office2010高级应用程序,计算机办公软件应用office2010高级解题步骤
  9. java的compare to(),java – compare()和compareTo()之间有什么区别?
  10. afterburner功耗限制调不了_为啥我的MSIAfterburner很多项都拖不了
  11. 【数学建模】数学建模学习4---动态规划(例题+matlab代码实现)
  12. 【数据库】E-R图相关知识、绘制方法及工具推荐
  13. 抽象代数笔记-群、子群、商群
  14. Elastic 配置 TLS 加密传输
  15. CAT1模块EC200S 4G物联网模块串口透传MQTT协议 快速入门指导资料
  16. 综合概括-中国制造 2025
  17. 通达信公式转python为什么很难_[转]N年Python老司机,血泪总结新手常见10大错误...
  18. vue + axios config url 转码 空格转成+,导致请求失败(前端解决)
  19. java.lang.ClassCastException: java.lang.Integer cannot be cast to java.math.BigD
  20. Process On 免费在线作图工具

热门文章

  1. cad面积计算机,CAD中如何计算面积,计算面积的方法和命令汇总
  2. 快手开店怎么引流?快手小店自上线以来就吸引众多的商家入驻
  3. 数据库系统(PostgreSQL)
  4. 深度学习 图像分割开源代码(附链接,超级全)
  5. Software Protection无法启动造成slmgr.vbs激活win10失败
  6. 极客时间Go实战训练营zui新
  7. php模板数组长度判断,Twig模板获取数组长度【原创】
  8. 2018年8月win10教育版education最新激活密钥
  9. CTC 技术介绍概述——啃论文系列
  10. 七大基本排序算法(升序排列)