当前位置: 代码迷 >> JavaScript >> uv_queue_work不在节点addon中运行callback_method(c ++)
  详细解决方案

uv_queue_work不在节点addon中运行callback_method(c ++)

热度:57   发布时间:2023-06-07 16:30:40.0

我在C ++中创建一个节点插件,我希望能够从其他线程进行回调。 为了尝试它,我正在使用uv_queue_work和Nan进行以下测试。 如果我调用函数Hello,它应该为方法firstMethod启动一个新线程,当它完成时,在另一个线程中调用下一个方法“callbackMethod”,在那里我将回调Javascript。 但由于某种原因,它运行第一种方法,而不运行第二种方法。

这是我的代码。

void Hello(const v8::FunctionCallbackInfo<v8::Value>& args) {
    v8::Isolate* isolate = v8::Isolate::GetCurrent();
    v8::HandleScope scope(isolate);
    v8::Local<v8::Function> callback;

    callback = args[0].As<v8::Function>();

    ListBaton* baton = new ListBaton();
    baton->callback = new Nan::Callback(callback);

    uv_work_t* req = new uv_work_t();
    req->data = baton;
    uv_queue_work(uv_default_loop(), req, firstMethod, callbackMethod);
}

void firstMethod(uv_work_t* req) {
    std::cout << "Entering PRE thread" << std::endl;
    sleep(1);
    std::cout << "Leaving PRE thread" << std::endl;
}

void callbackMethod(uv_work_t* req, int status) {
    v8::Isolate* isolate = v8::Isolate::GetCurrent();
    v8::HandleScope scope(isolate);
    if(!isolate)
    {
        std::cout << "Isolate was null" << std::endl;
        isolate = v8::Isolate::New();
        isolate->Enter();
    }
    ListBaton* data = static_cast<ListBaton*>(req->data);

    v8::Local<v8::Value> argv[2] = {
            v8::Undefined(isolate),
            v8::String::NewFromUtf8(isolate,"WORLD")
    };


    std::cout << "Sending callback" << std::endl;
    data->callback->Call(2,argv);
}
void init (v8::Handle<v8::Object> target) {
    NODE_SET_METHOD(target, "hello", Hello);
}

NODE_MODULE(HelloNan, init);

如果你们能帮助我,我会很感激...

如果是实际尝试,请关注而不是数据 - > callback-> Call(2,argv);

// execute the callback
Local<Function>::New(isolate, data->callback)->Call(isolate->GetCurrentContext()->Global(), 2, argv);

// Free up the persistent function callback
data->callback.Reset();

delete data;