が見えます。関数が別の関数にnext
プロパティセットを持つオブジェクトを返します。
...
auto iter_template = Nan::New<v8::FunctionTemplate>();
Nan::SetCallHandler(iter_template, [](const Nan::FunctionCallbackInfo<v8::Value> &info) {
auto next_template = Nan::New<v8::FunctionTemplate>();
Nan::SetCallHandler(next_template, My_Obj::next, info.Data());
auto obj = Nan::New<v8::Object>();
Nan::Set(obj, Nan::New<v8::String>("next").ToLocalChecked(),
next_template->GetFunction());
info.GetReturnValue().Set(obj);
}, Nan::New<v8::External>(self));
info.GetReturnValue().Set(iter_template->GetFunction());
...
next
機能も引数を取りません。呼び出しごとに反復値を順番に返します。私はこのためにC++イテレータを使用しています:
NAN_METHOD(My_Obj::next) {
auto self = static_cast<My_Obj*>(info.Data().As<v8::External>()->Value());
bool done = self->iter == self->contents.end();
auto obj = Nan::New<v8::Object>();
Nan::Set(obj, Nan::New<v8::String>("done").ToLocalChecked(),
Nan::New<v8::Boolean>(done));
if (!done) {
Nan::Set(obj, Nan::New<v8::String>("value").ToLocalChecked(),
Nan::New<v8::String>(self->iter->first.c_str()).ToLocalChecked());
}
self->iter++;
info.GetReturnValue().Set(obj);
}
私はラップされたオブジェクト自体に状態を保持しています。これは、このジェネレータをリエントラントにしません。 read/writeオブジェクトにとってはおそらくこれはうまくいくかもしれません。何らかの読み取り専用の状態保持アプローチがおそらく保証されているからです。
full code for an example objectが利用可能です。
ええ、幸運にも、その種の "標準的な質問" _。 –