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中包含的很多类型和方法还需要深入去了解,留待以后研究。