gpt4 book ai didi

javascript - v8::HandleScope::CreateHandle() 中的 fatal error # 无法在没有 HandleScope 的情况下创建句柄

转载 作者:行者123 更新时间:2023-12-01 14:52:17 25 4
gpt4 key购买 nike

我正在编写一个 .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)

我没用过 v8HandleScopeCreateHandle在我的代码中的任何地方运行。
因为我对 promise 的所有这些东西都不熟悉和 async ,所以我对如何解决这个问题一无所知。
请帮助

最佳答案

根据我的经验,我创建并刚刚发布了 napi-threadsafe-deferred ,您可以在这种情况下使用它。它基于 C++ 包装器 node-addon-api不过,如果你愿意,你可以将它移植到普通的 NAPI。
它在主 js 线程上异步执行实际的 promise 解析/拒绝,这是唯一允许调用它的线程。
你可以重写你的代码(忽略噪音以专注于重要的东西):

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();
}

关于javascript - v8::HandleScope::CreateHandle() 中的 fatal error # 无法在没有 HandleScope 的情况下创建句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62431517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com