nodejs addon实现回调函数事件
封装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-REPL/回调函数/事件循环
REPL 回调函数 事件循环REPL----------------------------------------------------- Node.js REPL(Read Eval Print ...
- NodeJS学习笔记 —— 回调函数与callback hell
什么是回调函数 编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是编写库:而应用编程就是利用写好的 ...
- nodejs中处理回调函数的异常
假设是使用nodejs+express3这个经典的组合.那么有一种非常方面的处理回调函数异常的方法: 1. 安装模块:express-domain-middleware 2. 增加例如以下的代码: a ...
- setwindowshookex回调函数不执行_ECMAScript 6 入门教程—Generator 函数的异步应用
作者 | 阮一峰异步编程对 JavaScript 语言太重要.JavaScript 语言的执行环境是"单线程"的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Gener ...
- 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)
回调函数传参:函数指针做函数参数(回调函数) 目录 背景 回调函数是实现函数分层且单向依赖的好办法,使用函数指针运行 struct结构体回调函数代码更清晰 简单理解回调函数 Demo 其他回调函数博文 ...
- go 协程回调函数 传入参数_ECMAScript 6 入门教程—Generator 函数的异步应用
作者 | 阮一峰异步编程对 JavaScript 语言太重要.JavaScript 语言的执行环境是"单线程"的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Gener ...
- 彻底搞懂SQLite回调函数查询
文章目录 一.理解回调函数 1.回调函数流程 2.回调函数实例 3.回调函数方式 二.sqlite3_exec的回调函数 callback 1.先看sqlite3_exec() 2.在看回调callb ...
- Node.js —— 回调函数callback
一.什么是回调函数 1.回调函数是作为参数传递给另一个函数 2.回调函数是一段可执行的代码段,它作为一个参数传递给其他的代码,其作用是在需要的时候方便调用这段(回调函数)代码 3. 函数运行完成,再执 ...
- 【NodeJs-5天学习】第一天篇④ ——了解NodeJs回调函数和事件驱动机制
[NodeJs-5天学习]第一天篇④ --NodeJs回调函数和事件处理机制 1.Node.js 中的回调(Callback)函数 2.Nodejs事件循环模型 2.1 浅析事件驱动 2.2 深入No ...
最新文章
- 避免35岁现象,我给技术人的建议永远是架构师!
- 不会三种编程语言的不算程序员 走近阿里云 MVP烁淼吐槽大佬
- npm run dev 报错echarts
- go 数据添加元素和删除特定元素
- 可以供MFC调用的,QT实现的DLL(qtwinmigrate实现)
- 甲子光年 | 为什么知识图谱终于火了?
- python爬虫requests源码链家_python爬虫——爬取链家房价信息(未完待续)
- 计算机office2010高级应用程序,计算机办公软件应用office2010高级解题步骤
- java的compare to(),java – compare()和compareTo()之间有什么区别?
- afterburner功耗限制调不了_为啥我的MSIAfterburner很多项都拖不了
- 【数学建模】数学建模学习4---动态规划(例题+matlab代码实现)
- 【数据库】E-R图相关知识、绘制方法及工具推荐
- 抽象代数笔记-群、子群、商群
- Elastic 配置 TLS 加密传输
- CAT1模块EC200S 4G物联网模块串口透传MQTT协议 快速入门指导资料
- 综合概括-中国制造 2025
- 通达信公式转python为什么很难_[转]N年Python老司机,血泪总结新手常见10大错误...
- vue + axios config url 转码 空格转成+,导致请求失败(前端解决)
- java.lang.ClassCastException: java.lang.Integer cannot be cast to java.math.BigD
- Process On 免费在线作图工具