2012-04-26 18 views
10

Bare con me come spiego questo.Come passare un oggetto C++ spostato a un callback Javascript?

Sto provando a scrivere un modulo Node.js, utilizzando C++, che esegue il wrapping ed espone alcune classi da libhdf5.

Attualmente sono interessato a due classi di libhdf5. Il primo è File e apre un file hdf5. Il secondo è Group e rappresenta i gruppi all'interno di quel file. Ottieni oggetti Group da un oggetto File.

Ho scritto del codice in cui creo un oggetto File e provo a ottenere uno Group da esso. Sto cercando di rendere il mio modulo Node.js il più possibile come Javascripty, quindi voglio restituire il gruppo usando un callback. Quindi, sto cercando di codificare il mio modulo in modo che sia usato in questo modo:

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

Così, nel codice C++ per il mio File involucro, mi piacerebbe avere una funzione che mappa la funzione getGroup qui, ed è 'Chiamare la funzione anonima fornita, inoltrando eventuali errori così come il nuovo wrapper di oggetti Group.

Dato che mi è sembrato quello che la documentazione Node.js mostra essere un factory of wrapped objects, ho modellato il mio codice Group dopo gli esempi.

Quindi, ho il mio wrapper Group codificato, ma sono bloccato cercando di istanziarlo. Non so ancora abbastanza per sapere come allontanarmi dall'uso della classe v8 Arguments per i parametri di funzione. Per questo motivo, non riesco a passare alcuni parametri che mi servono per la mia funzione di costruttore persistente v8 (perché sto creando un'istanza da C++, e non da JS-land).

Qualcuno potrebbe dare un'occhiata a my code for libhdf5 e darmi un puntatore su come raggiungere questo obiettivo? Mi sento come se fossi quasi lì, ma mi manca qualcosa.

Ecco il mio Group involucro, con funzione di costruzione ha evidenziato: https://github.com/ryancole/node-hdf5/blob/master/src/h5_group.cc#L57-72

Ecco il mio File involucro, con la linea di hightlighted in cui avrei avuto bisogno di passare i miei parametri, come argomenti (o quello che è che ho bisogno di cambiare questo per questo lavoro: https://github.com/ryancole/node-hdf5/blob/master/src/h5_file.cc#L110

grazie in anticipo, e grazie per aver letto questo muro di testo :)

risposta

9

siete quasi arrivati.. Non è necessario passare Arguments a Group::Instantiate. Basta passare ciò di cui hai bisogno e utilizzare il costruttore per creare la nuova istanza di Group. Ad esempio:

Handle<Value> Group::Instantiate(const std::string& name) { 
    HandleScope scope; 

    Local<v8::Value> argv[1] = { 
     Local<v8::Value>::New(String::New(name.c_str())) 
    }; 

    return scope.Close(Constructor->NewInstance(1, argv)); 
} 

Il metodo Group::New fa il resto dei lavori di costruzione.

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 si può fare questo:

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

è quello di dire che avete bisogno di un metodo factory ('Gruppo :: Instantiate') per restituire un'istanza di un'altra classe ? – ZachB

Problemi correlati