nodejs c / c ++アドオンを作成したときにこのエラーに遭遇しました。非同期コールバックをPersistentに保存しようとしたときに発生しました。
しかし、私はv8.hで宣言を見つけました:V8_INLINE Persistent(Isolate * isolate、Local <S> that)。通話に問題はないようです。
コードを添付してください。前もって感謝します!それは私を混乱させました。
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)
回答:
回答№1は0差し迫った問題は、あなたがしないことです Persistent<..>::New()
、あなただけ .Reset()
に保存したい値で Persistent
。例えば:
request->callback.Reset(isolate, callback);
注意すべきその他の事項:
あなたは
HandleScope
にtest()
これは、関数がすでにJavaScriptから直接呼び出されているため、アクティブなスコープが既に存在するためです。あなただけが必要ですHandleScope
メインスレッドでV8 APIを使用している場合。libuvスレッドプールまたはJSランドから直接ではない他の場所から来ています。あなたは本当に使うことを考えるべきです
nan
。これは、V8バージョン間の違いを滑らかにするのに役立ち、分離株などの詳細を心配する必要がなくなります。まだそれらに精通していない場合は、オンラインでV8 APIドキュメントがあります ここに.