2017-12-11 5 views
1

私はC++ NANを使用してノードのためのアドオンを書いているが、私は正しくナンを使用する方法が混乱している:: HandleScope(https://github.com/nodejs/nan/blob/master/doc/scopes.md#api_nan_handle_scopeNan :: HandleScopeを正しく使うには?

私のアプリケーションでは、私はこのような何か(エラーチェック削除をやっている、とコードのみの簡易版)が示されている:

static App* s_pApp = nullptr; 

NAN_METHOD(init) { 
    s_pApp = new App(); 
} 

NAN_METHOD(getData) { 
    info.GetReturnValue().Set(s_pApp->getData()); 
} 

NAN_METHOD(close) { 
    delete s_pApp; 
    s_pApp = nullptr; 
} 

//-------- This create a new json object based on the current state of _pRootNode which is a TreeNode class object previously populated 
v8::Local<v8::Object> App::getData() const { 
    Nan::EscapableHandleScope scope; 
    v8::Local<v8::Object> obj = _pRootNode->getData(); 
    return scope.Escape(obj); 
} 

//-------- The TreeNode class 
v8::Local<v8::Object> TreeNode::getData() const { 
    return getData(this); 
} 

//each node contains data plus a vector of children that are also TreeNodes 
v8::Local<v8::Object> TreeNode::getData(const TreeNode* pNode) const { 
    v8::Local<v8::Object> jsonObject = Nan::New<v8::Object>(); 

    addProperty(jsonObject, "isImportant", _isImportant); 
    addProperty(jsonObject, "value", _value); 
    addProperty(jsonObject, _children); 

    return jsonObject; 
} 

//The addProperty functions are used to populate the jsonObject which will eventually be returned back to JavaScript 
template<class T> 
void TreeNode::addProperty(v8::Local<v8::Object>& jsonObject, const char* szName, T propValue) { 
    v8::Local<v8::String> prop = Nan::New(szName).ToLocalChecked(); 
    v8::Local<v8::Value> value = getValue(propValue); //returns the appropriate v8 value 
    Nan::Set(jsonObject, prop, value); 
} 

void TreeNode::addProperty(v8::Local<v8::Object>& jsonObject, const std::vector<const TreeNode*>& children) { 
    if(children.empty()) { 
    return; 
    } 

    v8::Local<v8::String> prop = Nan::New("children").ToLocalChecked(); 

    v8::Local<v8::Array> values = Nan::New<v8::Array>(children.size()); 
    for(int i = 0, numChildren = children.size(); i < numChildren; ++i) { 
    values->Set(i, children.at(i)->getData()); //recursive call 
    } 

    Nan::Set(jsonObject, prop, values); 
} 

をだから我々は、上記のコードで見ることができるよう、私はスコープを処理しています唯一の場所は、JSONオブジェクトを返すのApp ::のgetData()の呼び出しでありますTreeNodeクラスによって作成されます。これは正しいです?または、HandleScopeをNan:Newが呼ばれているところで使うべきですか?または、私は実際に生成された値を返すしたいので、それもHandleScopeではなくEscapableHandleScopeを使用する必要がありますか?ドキュメントの値下げから直接取得

答えて

0

Nan::HandleScopeからhttps://github.com/nodejs/nan/blob/master/doc/scopes.md#api_nan_handle_scope

は、新しいV8 JavaScriptオブジェクトを作成するたびに新しいナン:: HandleScopeを割り当てます。暗黙的なHandleScopeはJavaScriptアクセス可能なメソッドで作成されるため、自分で挿入する必要はありません。

Nan::EscapableHandleScope - ナン:: HandleScopeと同様にhttps://github.com/nodejs/nan/blob/master/doc/scopes.md#api_nan_escapable_handle_scope

が、関数は、その中に作成されたV8 JavaScriptのタイプを返す必要がある場合に使用する必要があります。


だから、あなたはNan::EscapableHandleScopeApp::getData()内を使用して正しかったです。しかし、Nan::EscapableHandleScope内のApp::getData()はに移動することができます。これは実際にV8 Javascriptタイプを作成する関数なので、

ここで行ったことに何か問題はないとは思われませんが、返されるオブジェクトを作成する関数の近くに(好ましくは)Nan::HandleScope/Nan::EscapableHndleScopeを置く傾向があります。

+0

ドキュメントでは、新しいv8オブジェクトを作成するたびにHandleScopeを呼び出す必要があると言われています。つまり、TreeNode :: addProperty関数内で、TreeNode :: getData内で呼び出す必要がありますあなたは言いました、それ以外のNan:Newはどこに呼ばれていますか? –

+0

オブジェクトは一度しか作成しないでください。オブジェクトを作成する関数は 'Nan :: EscapableHandleScope'を使うべきです。これは、オブジェクトがスコープされているV8を示します。 'HandleScope'は1つだけ必要です... EscapedHandleScopesを返す関数を呼び出す関数は、独自のHandleScopesを必要としません – mkrufky

関連する問題