Неустранимая ошибка в v8 :: HandleScope :: CreateHandle () # Невозможно создать дескриптор без HandleScope - PullRequest
2 голосов
/ 17 июня 2020

Я пишу файл. cc, чтобы я мог читать функции из него в файле. js.

Структура кода следующая:

napi_value createResult(napi_env env, string resultType, int64_t handlevalue) {
    napi_status status;
    napi_value ObjectRef, returnObject, errorObject;

    printf("INSIDE FUCNTION: PART1\n");

    // Creating NAPI Object's
    status = napi_create_object(env, &ObjectRef);

    std::cout<<"status="<<status<<std::endl;

    assert(status == napi_ok);


    printf("INSIDE FUCNTION: PART2\n");

    status = napi_create_object(env, &errorObject);
    assert(status == napi_ok);

    printf("INSIDE FUCNTION: PART3\n");

    status = napi_create_object(env, &returnObject);
    assert(status == napi_ok);

    printf("INSIDE FUCNTION: PART4\n");

    const char* resultTypeChar = resultType.c_str();
    status = napi_set_named_property(env, returnObject, &resultTypeChar[0], ObjectRef);
    assert(status == napi_ok);

    printf("INSIDE FUCNTION: PART5\n");

    return returnObject;
}

void ABC(napi_env env, void* data){

    // some code....
    size_t handlevalue = access._handle;

    obj->result = createResult(env,"access",handlevalue);

    obj->async_action_status = 0;
  }
}

napi_value f1(napi_env env,
  napi_callback_info info) {
  //
  napi_value promise;
  napi_status status;
  // some code....

  napi_value resource_name;
  napi_create_string_utf8(env, "f1", NAPI_AUTO_LENGTH, &resource_name);

  napi_create_async_work(env, NULL, resource_name, ABC, DEF, obj, &obj->work);

  napi_queue_async_work(env, obj->work);

  return promise;
}

При компиляции этого и последующем запуске файла. js отображается следующая ошибка:

INSIDE FUCNTION: PART1

#
# Fatal error in v8::HandleScope::CreateHandle()
# Cannot create a handle without a HandleScope
#

Illegal instruction (core dumped)

Я не использовал функции v8, HandleScope или CreateHandle где-либо в моем коде .

Поскольку я новичок во всех этих promise и async, поэтому я не знаю, как решить эту проблему.

Пожалуйста, помогите

1 Ответ

1 голос
/ 30 июня 2020

Исходя из моих знаний, я создал и только что выпустил napi-threadsafe-deferred , который вы могли бы использовать в этой ситуации. Однако он основан на оболочке C ++ node-addon-api , но вы можете перенести его на простой NAPI, если хотите.

Он выполняет фактическое разрешение / отклонение обещания асинхронно на основной js поток, который является единственным потоком, из которого он может быть вызван.

Вы можете переписать свой код (без шума, чтобы сосредоточиться на важном):

napi_value createResult(napi_env env, string resultType, int64_t handlevalue) {

    // ...

    return returnObject;
}

void ABC(napi_env env, void* data){

    // ...

    myDeferred.Reslove([&handlevalue]{
        // this is executed on the correct thread!
        // BEWARE, that references passed in might get
        // invalid as this code is executed after the
        // ABC has returned!
        return createResult(env,"access",handlevalue);
    });

    // ...
  }
}

napi_value f1(napi_env env,
  napi_callback_info info) {

    ThreadSafeDeferred myDeferred = new ThreadSafeDeferred(Env());
  
    // pass myDeferred to your async task (calling ABC)

    return ThreadSafeDeferred.Promise();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...