如何从C++;到Javascript? 我在C++节点扩展中定义了下面的包类。< /P> class JSStatus : public Nan::ObjectWrap { public: long statusCode; std::string statusMessage; std::string statusDetails; static NAN_MODULE_INIT(Init); static NAN_METHOD(New); static NAN_GETTER(HandleGetters); static NAN_SETTER(HandleSetters); static Nan::Persistent<v8::FunctionTemplate> constructor; }; class JSStatus:public Nan::ObjectWrap{ 公众: 长状态码; std::字符串状态消息; std::字符串状态详细信息; 静态NAN_模块_INIT(INIT); 静态NAN_法(新); 静态吸气剂(手电筒); 静态NAN_设定器(手柄设定器); 静态Nan::持久构造函数; };
正常的调用顺序如下(全部在Javascript线程上):如何从C++;到Javascript? 我在C++节点扩展中定义了下面的包类。< /P> class JSStatus : public Nan::ObjectWrap { public: long statusCode; std::string statusMessage; std::string statusDetails; static NAN_MODULE_INIT(Init); static NAN_METHOD(New); static NAN_GETTER(HandleGetters); static NAN_SETTER(HandleSetters); static Nan::Persistent<v8::FunctionTemplate> constructor; }; class JSStatus:public Nan::ObjectWrap{ 公众: 长状态码; std::字符串状态消息; std::字符串状态详细信息; 静态NAN_模块_INIT(INIT); 静态NAN_法(新); 静态吸气剂(手电筒); 静态NAN_设定器(手柄设定器); 静态Nan::持久构造函数; };,javascript,node.js,v8,node.js-addon,node.js-nan,Javascript,Node.js,V8,Node.js Addon,Node.js Nan,正常的调用顺序如下(全部在Javascript线程上): Javascript调用MyExtension::UpdateStatus(callbackFunction) UpdateStatus()保存“callbackFunction”供SetStatus()以后使用 UpdateStatus()调用本机库,该库将状态返回到名为SetStatus(NativeStatus)的已知命名方法 SetStatus()创建一个“JSStatus”,从nativeStatus复制值 SetStatus(
这似乎是一个很常见的事情,可以被NAN涵盖,但我无法确定如何做到这一点。有什么想法? < p>看起来没有办法在C++中“新建”一个对象,并将其传递给JavaScript。我的解决方法是创建一个通用JS对象,并一次向其中添加一个字段。很糟糕,但对NAN来说不是太难
// Send status to Javascript
void sendStatus(JSStatus* status) {
// Create callback parameters
const int argc = 1;
v8::Local<v8::Value> args[argc];
// Create generic JS object for status
v8::Local<v8::Object> jsObject = Nan::New<v8::Object>();
// Create property names & values for each field
v8::Local<v8::String> propName = Nan::New("statusCode").ToLocalChecked();
v8::Local<v8::Value> propValue = Nan::New(status->statusCode);
// Add field to JS object
Nan::Set(jsObject, propName, propValue);
// And again...
propName = Nan::New("statusMessage").ToLocalChecked();
propValue = Nan::New(status->statusMessage).ToLocalChecked();
Nan::Set(jsObject, propName, propValue);
// .... Etc., etc. for all the other fields ....
// Set parameter to JS object
args[0] = jsObject;
// Pass status to Javascript
v8::Local<v8::Value> jsReturnValue = jsStatusDelegate.Call(argc, args);
}
//将状态发送到Javascript
无效发送状态(JSStatus*状态){
//创建回调参数
常数int argc=1;
v8::本地args[argc];
//为状态创建通用JS对象
v8::Local jsObject=Nan::New();
//为每个字段创建属性名称和值
v8::Local propName=Nan::新建(“状态代码”).ToLocalChecked();
v8::Local propValue=Nan::新建(状态->状态代码);
//向JS对象添加字段
Nan::Set(jsObject、propName、propValue);
//再一次。。。
propName=Nan::新建(“statusMessage”).ToLocalChecked();
propValue=Nan::新建(状态->状态消息).ToLocalChecked();
Nan::Set(jsObject、propName、propValue);
//……等等,等等,所有其他字段。。。。
//将参数设置为JS对象
args[0]=jsObject;
//将状态传递给Javascript
v8::Local jsReturnValue=jsStatusDelegate.Call(argc,args);
}
> > p>看起来,C++中的对象没有“新”的对象,并将其传递给JavaScript。我的解决方法是创建一个通用JS对象,并一次向其中添加一个字段。很糟糕,但对NAN来说不是太难
// Send status to Javascript
void sendStatus(JSStatus* status) {
// Create callback parameters
const int argc = 1;
v8::Local<v8::Value> args[argc];
// Create generic JS object for status
v8::Local<v8::Object> jsObject = Nan::New<v8::Object>();
// Create property names & values for each field
v8::Local<v8::String> propName = Nan::New("statusCode").ToLocalChecked();
v8::Local<v8::Value> propValue = Nan::New(status->statusCode);
// Add field to JS object
Nan::Set(jsObject, propName, propValue);
// And again...
propName = Nan::New("statusMessage").ToLocalChecked();
propValue = Nan::New(status->statusMessage).ToLocalChecked();
Nan::Set(jsObject, propName, propValue);
// .... Etc., etc. for all the other fields ....
// Set parameter to JS object
args[0] = jsObject;
// Pass status to Javascript
v8::Local<v8::Value> jsReturnValue = jsStatusDelegate.Call(argc, args);
}
//将状态发送到Javascript
无效发送状态(JSStatus*状态){
//创建回调参数
常数int argc=1;
v8::本地args[argc];
//为状态创建通用JS对象
v8::Local jsObject=Nan::New();
//为每个字段创建属性名称和值
v8::Local propName=Nan::新建(“状态代码”).ToLocalChecked();
v8::Local propValue=Nan::新建(状态->状态代码);
//向JS对象添加字段
Nan::Set(jsObject、propName、propValue);
//再一次。。。
propName=Nan::新建(“statusMessage”).ToLocalChecked();
propValue=Nan::新建(状态->状态消息).ToLocalChecked();
Nan::Set(jsObject、propName、propValue);
//……等等,等等,所有其他字段。。。。
//将参数设置为JS对象
args[0]=jsObject;
//将状态传递给Javascript
v8::Local jsReturnValue=jsStatusDelegate.Call(argc,args);
}
这似乎相关,但使用了“node”而不是“nan”。另外,我没有使用AsyncWorkers,因为我知道我不在另一个线程上。这似乎相关,但使用“node”而不是“nan”。另外,我没有使用AsyncWorkers,因为我知道我不在另一个线程上。