2016-11-29 13 views
0

Ich habe diesen Fehler beim Schreiben eines Nodejs C/C++ - Addon, trat auf, wenn ich versuche, einen Async-Callback in Persistent speichern.keine übereinstimmende Funktion für Aufruf an Persistent <Function> :: Neu (Isolieren * &, Local <Function> &)

Aber ich fand die Deklaration in v8.h: V8_INLINE Persistent (isolieren * isolieren, Local < S> das). Scheint nichts ist falsch mit dem Anruf.

Schließen Sie meinen Code an. Vielen Dank im Voraus! Es hat mich Tage verwirrt.

struct reqData 
{ 
    int result; 
    int a; 
    int b; 
    char name[128]; 
    Persistent<Function> callback; 
}; 

static Handle<Value> test(const FunctionCallbackInfo<Value>& args) 
{ 
    Isolate *isolate = Isolate::GetCurrent(); 
    HandleScope scope(isolate); 
    if (args.Length() < 3 || !args[0]->IsNumber() || !args[1]->IsNumber()) 
    { 
     return (*isolate).ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Bad argument"))); 
    } 

    ssize_t int1 (args[0]->Int32Value()); 
    ssize_t int2 (args[1]->Int32Value()); 
    char nameBuffer[128] = {0}; 
    args[2]->ToString()->WriteOneByte(nameBuffer); 

    if (args[3]->IsFunction()) 
    { 
     Local<Function> callback = Local<Function>::Cast(args[3]); 

     reqData* request = new reqData; 
     request->callback = Persistent<Function>::New(isolate,callback); 



     request->a = int1; 
     request->b = int2; 
     strcpy(request->name, nameBuffer); 

     uv_work_t* req = new uv_work_t(); 
     req->data = request; 

     uv_queue_work(uv_default_loop(), req, workerFunc, afterWorkFunc); 
    } 
    else 
    { 
     return (*isolate).ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Callback missing"))); 
    } 

    return Undefined(isolate); 
} 

extern "C" 
{ 
    // equal to js 
    // 
    // exports.test = function Test(){}; 
    // 
    static void init(Local<Object> exports) 
    { 
     //target->Set(String::NewSymbol("asyncAddon"), FunctionTemplate::New(test)->GetFunction()); 
     NODE_SET_METHOD(exports, "asyncAddon", test); 
    } 
} 

NODE_MODULE(asyncAddon, init) 
+0

Für welche Version des Knotens bauen Sie auf? – mscdex

+0

@ mscdex Node.js v6.2.0. –

Antwort

0

Die unmittelbare Problem ist, dass Sie nicht Persistent<..>::New() tun, die Sie gerade .Reset() mit dem Wert, den Sie in der Persistent speichern möchten. Zum Beispiel:

request->callback.Reset(isolate, callback); 

Andere Dinge zu beachten:

  • Sie keine HandleScope in test() müssen, weil die Funktion bereits direkt von JavaScript aufgerufen wird, so gibt es bereits einen aktiven Bereich. Sie benötigen nur eine HandleScope, wenn Sie die V8-API im Hauptthread verwenden, die aus dem libuv-Thread-Pool stammt oder an einem anderen Ort, der nicht direkt von JS land stammt.

  • Sie sollten wirklich in Betracht ziehen, nan zu verwenden. Es hilft, Unterschiede zwischen den V8-Versionen auszugleichen und Sie müssen sich nicht um Details wie Isolate und andere Dinge kümmern.

  • Wenn Sie noch nicht mit ihnen vertraut sind, gibt es V8 API Docs online here.

+0

Das hilft wirklich, besonders die Notizen! Danke! –

Verwandte Themen