nodejs addon

怀飞掣
2023-12-01

nodejs和C++配合起来,又能满足前端的快速开发,也能达到核心层的性能要求。

之前也写过用C++写addon的例子。在实际使用过程也遇到了一些问题:

有些场景需要js注册回调函数,供底层调用,这个时候会将回调函数记录v8::Persistent<v8::Function>,实际使用的时候是需要转换为v8::Local<v8::Function>来调用:

auto isolate = v8::Isolate::GetCurrent();
v8::HandleScope handleScope(isolate);
v8::Local<v8::Function> cb = v8::Local<v8::Function>::New(isolate, _disconnectCallback);
cb->Call(isolate->GetCurrentContext(), Null(isolate), 0, NULL);

如上面这般,注意到了需要Isolate,那么在普通的C++函数肯定不能调用了,这个时候就需要借助:

uv_work_t* work = new uv_work_t;
uv_queue_work(uv_default_loop(), work, (uv_work_cb)EmptyFunc, (uv_after_work_cb)JSOnDisconnect);

 再来看EmptyFunc:

void EmptyFunc(uv_work_t* work)
{
	// do nothing
}

这个函数不需要做任何事情,主要是后面的:

void JSOnDisconnect(uv_work_t* work)
{
	auto isolate = v8::Isolate::GetCurrent();
	v8::HandleScope handleScope(isolate);
	v8::Local<v8::Function> cb = v8::Local<v8::Function>::New(isolate,_disconnectCallback);
	cb->Call(isolate->GetCurrentContext(), Null(isolate), 0, NULL);
	delete work;
}

 在这个函数中调用v8::Isolate::GetCurrent();是可以拿到Isolate的,这样通过uv_queue_work一转发就可以调用实际的js函数了。

还有一个点,如果是直接执行node index.js(自己写的js调用代码),js执行完成之后不会等待C++层的逻辑执行完毕回调js函数直接就退出了。改用先进入node(在命令行执行node),然后.load index.js就可以了。

V8中包含的很多类型和方法还需要深入去了解,留待以后研究。

 

 类似资料:

相关阅读

相关文章

相关问答