node-addon-api 碰到的问题

分号 2021-01-27 05:04:15
我在vscode下建了一个c/c++ addon项目,学习插件的开发。
我用到了两个帮助类:
1,AsyncProgressQueueWorker
2,ObjectWrap

第一个类,我用来做一些长计算
第二个类,用于包装第一个类,这样,在 js 里调用时,可以用 new 的方式创建

接口暴露的方式如下:


Napi::Value Echo(const Napi::CallbackInfo &info)
{
if (info.Length() != 8)
{
Napi::TypeError::New(info.Env(), "参数不足").ThrowAsJavaScriptException();
return Napi::Boolean::New(info.Env(), false);
}

std::string strCom = info[0].As<Napi::String>();
int nBaundRate = info[1].As<Napi::Number>().Int32Value();
std::string strParity = info[2].As<Napi::String>();
unsigned char nDataSize = info[3].As<Napi::Number>().Int32Value();
std::string strStopBits = info[4].As<Napi::String>();
Napi::Function okcb = info[5].As<Napi::Function>();
Napi::Function errcb = info[6].As<Napi::Function>();
Napi::Function progresscb = info[7].As<Napi::Function>();

CZLCom *zlcom = new CZLCom(okcb, errcb, progresscb);
zlcom->Queue();
if (zlcom->Open(strCom, nBaundRate, strParity, nDataSize, strStopBits))
{
/* code */
return Napi::Boolean::New(info.Env(), false);
}
else
{
return Napi::Boolean::New(info.Env(), true);
}
}
。。。。。。

Napi::Object CZLComWrapper::Init(Napi::Env env, Napi::Object exports)
{
Napi::Function func = DefineClass(
env, "ZLComWrapper",
{InstanceMethod("open", &CZLComWrapper::Open),
InstanceMethod("close", &CZLComWrapper::Close),
InstanceMethod("getValue", &CZLComWrapper::GetValue),
StaticMethod<&CZLComWrapper::CreateNewItem>("CreateNewItem")});

Napi::FunctionReference *constructor = new Napi::FunctionReference();
*constructor = Napi::Persistent(func);
env.SetInstanceData(constructor);
exports.Set("ZLComWrapper", func);
return exports;
}

。。。。。。

Napi::Value CZLComWrapper::Open(const Napi::CallbackInfo &info)
{
if (info.Length() != 8)
{
Napi::TypeError::New(info.Env(), "参数不足").ThrowAsJavaScriptException();
return Napi::Boolean::New(info.Env(), false);
}

std::string strCom = info[0].As<Napi::String>();
int nBaundRate = info[1].As<Napi::Number>().Int32Value();
std::string strParity = info[2].As<Napi::String>();
unsigned char nDataSize = info[3].As<Napi::Number>().Int32Value();
std::string strStopBits = info[4].As<Napi::String>();
Napi::Function okcb = info[5].As<Napi::Function>();
Napi::Function errcb = info[6].As<Napi::Function>();
Napi::Function progresscb = info[7].As<Napi::Function>();

m_pCom = new CZLCom(okcb, errcb, progresscb);
m_pCom->Queue();
if (m_pCom->Open(strCom, nBaundRate, strParity, nDataSize, strStopBits))
{
return info.Env().Undefined();
}

return Napi::Boolean::New(info.Env(), false);
}

。。。。。。

Napi::Object Init(Napi::Env env, Napi::Object exports)
{
exports.Set(
Napi::String::New(env, "echo"),
Napi::Function::New(env, Echo));

return CZLComWrapper::Init(env, exports);
}


js 的调用方式如下:

const addon = require('./build/Debug/greet.node')

const onOk = (msg) => {
console.log(msg);
};

const onErr = (msg) => {
console.log(msg);
};

const onProgress = (msg) => {
console.log(msg);
};

// 类方式
var com = new addon.ZLComWrapper();
var ret = com.open("com3", 9600, "n", 8, "1", onOk, onErr, onProgress);
console.log(ret);
// 函数方式
// var ret = addon.echo("com3", 9600, "n", 8, "1", onOk, onErr, onProgress);
// console.log(ret);


然后我发现采用类方式的话,过了一小会儿,CZLComWrapper内部就收到了垃圾回收的消息,而函数方式就不会,
但是如果我在命令行测试(node inde.js),而不是在vscode下调试的话,就不会出现上述问题。
请问有没有人知道这是什么原因?
...全文
346 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

87,992

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧