/ / немає функції узгодження для виклику в постійний <Function> :: Новий (Isolate * &, Local <Function> &) - c ++, node.js

відсутня відповідна функція для виклику для Постійна <Функція> :: Нове (Ізоляція *, & Локальна функція &) - c ++, node.js

Я зіткнувся з цією помилкою під час написання додатка nodejs c / c ++, це сталося, коли я намагаюся зберігати зворотний виклик асинхронізації в "Постійний".

Але я знайшов декларацію в v8.h: V8_INLINE Постійний (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)

Відповіді:

0 для відповіді № 1

Безпосереднє питання полягає в тому, що ви цього не робите Persistent<..>::New(), ви просто .Reset() зі значенням, яке ви хочете зберегти в Persistent. Наприклад:

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

Інші речі, які слід зазначити:

  • Ви не потребуєте а HandleScope в test() оскільки функція вже викликається безпосередньо з JavaScript, тому вже є активна область. Вам потрібно лише HandleScope коли ви використовуєте API V8 в основному потоці, виходячи з пулу потоків libuv або якогось іншого місця, яке не знаходиться безпосередньо від землі JS.

  • Ви дійсно повинні розглянути можливість використання nan. Це допомагає згладити відмінності між версіями V8 та дозволяє не турбуватися про деталі, як ізоляти та інші речі.

  • Якщо ви ще не знайомі з ними, в Інтернеті є документи V8 API тут.