2016-04-11 8 views
3

V8 C++ APIを使用して、Javascriptで使用するジェネレータインタフェースをどのように実装できますか?私はfor-ofループのイテレータとして使用できるオブジェクトを作成したいと思います。Javascriptジェネレータ関数 - C++で書かれています

NAN_PROPERTY_GETTER(My_Obj::Getter) { 
    auto self = Nan::ObjectWrap::Unwrap<My_Obj>(info.This()); 
    if (property->IsSymbol()) { 
    if (Nan::Equals(property, v8::Symbol::GetIterator(info.GetIsolate())).FromJust()) { 
     ... 

引数を取らない機能で応答:必要だ最初の事はSymbol.iteratorのプロパティの検索にチェックすることであるように

+0

ええ、幸運にも、その種の "標準的な質問" _。 –

答えて

1

が見えます。関数が別の関数に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が利用可能です。

+0

"まず、Symbol.iteratorのプロパティールックアップを確認する必要があるようです。" - Node.js 0.12を使用してこれを行う方法はありますか? V8 3.28.71.19の 'Symbol'クラスのように' GetIterator'関数がありません。 –

関連する問題