Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从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 - Fatal编程技术网

如何从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::持久构造函数; };

如何从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(

正常的调用顺序如下(全部在Javascript线程上):

  • Javascript调用MyExtension::UpdateStatus(callbackFunction)
  • UpdateStatus()保存“callbackFunction”供SetStatus()以后使用
  • UpdateStatus()调用本机库,该库将状态返回到名为SetStatus(NativeStatus)的已知命名方法
  • SetStatus()创建一个“JSStatus”,从nativeStatus复制值
  • SetStatus()将“JSStatus”对象传递给名为StatusUpdated(JSStatus)的已知javascript函数
  • 我被困在5,因为似乎没有一种方法来“新”一个::C++中的ObjeTWrrp,然后把这个对象传递给JavaScript。
    这似乎是一个很常见的事情,可以被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,因为我知道我不在另一个线程上。