tes*_*est 5 javascript c++ asynchronous node.js promise
我正在编写一个 .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;
}
Run Code Online (Sandbox Code Playgroud)
在编译这个 & 然后运行一个 .js 文件时,显示以下错误:
INSIDE FUCNTION: PART1
#
# Fatal error in v8::HandleScope::CreateHandle()
# Cannot create a handle without a HandleScope
#
Illegal instruction (core dumped)
Run Code Online (Sandbox Code Playgroud)
我没有在代码中的任何地方使用 any v8
orHandleScope
或CreateHandle
function。
由于我对promise
and 的所有这些东西都不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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2145 次 |
最近记录: |