私はC++ NANを使用してノードのためのアドオンを書いているが、私は正しくナンを使用する方法が混乱している:: HandleScope(https://github.com/nodejs/nan/blob/master/doc/scopes.md#api_nan_handle_scope)Nan :: 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を使用する必要がありますか?ドキュメントの値下げから直接取得
ドキュメントでは、新しいv8オブジェクトを作成するたびにHandleScopeを呼び出す必要があると言われています。つまり、TreeNode :: addProperty関数内で、TreeNode :: getData内で呼び出す必要がありますあなたは言いました、それ以外のNan:Newはどこに呼ばれていますか? –
オブジェクトは一度しか作成しないでください。オブジェクトを作成する関数は 'Nan :: EscapableHandleScope'を使うべきです。これは、オブジェクトがスコープされているV8を示します。 'HandleScope'は1つだけ必要です... EscapedHandleScopesを返す関数を呼び出す関数は、独自のHandleScopesを必要としません – mkrufky