2012-04-26 4 views
10

Bare mit mir, wie ich das erkläre.Wie übergebe ich ein umschlossenes C++ Objekt an einen Javascript Callback?

Ich versuche, ein Node.js-Modul mit C++ zu schreiben, das einige Klassen von libhdf5 umschließt und verfügbar macht.

Ich bin zur Zeit in zwei Klassen von libhdf5 interessiert. Der erste ist File, und es öffnet sich eine hdf5-Datei. Der zweite ist Group, und er stellt Gruppen innerhalb dieser Datei dar. Sie erhalten Gruppenobjekte von einem Dateiobjekt.

Ich habe einen Code geschrieben, in dem ich ein File Objekt erstellen und versuchen, ein Group daraus zu erhalten. Ich versuche, mein Node.js-Modul als Javascripty wie möglich zu machen, also möchte ich die Gruppe mit einem Rückruf zurückgeben. Also, ich versuche mein Modul zu codieren, so dass es wie folgt verwendet wird:

var hdf5 = require('hdf5'); 
var file = new hdf5.File('/tmp/example.h5'); 
file.getGroup('foobar', function (err, group) { console.log(group); }); 

Also, in dem C++ Code für meinen File Wrapper, würde ich eine Funktion habe, die die hier getGroup Funktion abbildet, und es Ich würde die angegebene anonyme Funktion aufrufen und alle Fehler sowie den neuen Objektwrapper Group übergeben.

Angesichts dieser klang für mich wie, was die Node.js Dokumentation zeigt, um eine factory of wrapped objects zu sein, habe ich meinen Group Code nach den Beispielen dort modelliert.

Also, ich habe meine Group Wrapper codiert, aber ich stecken versucht, es zu instanziieren. Ich weiß noch nicht genug, um zu wissen, wie man von der Verwendung der Klasse V8 Arguments für Funktionsparameter abkommt. Aus diesem Grund kann ich nicht in der Lage sein scheinen in einigen Parameter zu übergeben, die ich für mein v8 persistent Konstruktorfunktion müssen (weil ich das von C++ bin instanziiert wird, und nicht von JS-Land).

Würde jemand bitte einen Blick auf my code for libhdf5 nehmen und geben Sie mir einen Zeiger, wie dies zu erreichen? Ich fühle mich, als wäre ich fast da, aber ich verpasse gerade etwas.

Hier sind meine Group Wrapper, mit Konstruktorfunktion hervorgehoben: https://github.com/ryancole/node-hdf5/blob/master/src/h5_group.cc#L57-72

Hier sind meine File Wrapper, mit der Linie hightlighted, wo ich in meinem Parameter zu übergeben brauchen würde, als Argument (oder was auch immer es ist, dass ich brauche ändern, um dies zu für diese zu arbeiten: https://github.com/ryancole/node-hdf5/blob/master/src/h5_file.cc#L110

Vielen dank im Voraus, und dank für das Lesen dieser Wand aus Text :)

Antwort

9

Sie sind fast da.. Sie müssen Arguments nicht an Group::Instantiate übergeben. Übergeben Sie einfach, was Sie brauchen, und verwenden Sie den Konstruktor, um die neue Instanz von Group zu erstellen. Zum Beispiel:

Die Methode Group::New erledigt den Rest der Bauarbeiten.

Handle<Value> Group::New(const Arguments& args) { 
    HandleScope scope; 

    if (!args[0]->IsString()) { 
     return ThrowException(Exception::TypeError(String::New("First argument must be a string"))); 
    } 
    const std::string name(*(String::Utf8Value(args[0]->ToString()))); 
    Group * const group = new Group(name); 
    bar->Wrap(args.This()); 

    return args.This(); 
} 

In File::OpenGroup Sie können dies tun:

Handle<Value> File::OpenGroup (const Arguments& args) { 
    HandleScope scope; 

    if (args.Length() != 2 || !args[0]->IsString() || !args[1]->IsFunction()) { 
     ThrowException(Exception::SyntaxError(String::New("expected name, callback"))); 
     return scope.Close(Undefined()); 
    } 
    const std::string name(*(String::Utf8Value(args[0]->ToString()))); 
    Local<Function> callback = Local<Function>::Cast(args[1]); 

    const unsigned argc = 2; 
    Local<Value> argv[argc] = { 
     Local<Value>::New(Null()), 
     Local<Value>::New(Group::Instantiate(name)) 
    }; 
    callback->Call(Context::GetCurrent()->Global(), argc, argv); 

    return scope.Close(Undefined()); 
} 

HTH

+0

Ist das zu sagen, dass Sie eine Factory-Methode benötigen ('Group :: Instantiate') eine Instanz einer anderen Klasse zurück ? – ZachB

Verwandte Themen