c++ - 原生 v8::Promise 结果
问题描述
我正在尝试使用 v8/ Nan从 C++ 调用 JS 函数,该函数又返回一个 Promise。
假设我有一个通用的 Nan 回调
Nan::Callback fn
然后我使用以下代码调用此函数
Nan::AsyncResource resource(Nan::New<v8::String>("myresource").ToLocalChecked());
Nan::MaybeLocal<v8::Value> value = resource.runInAsyncScope(Nan::GetCurrentContext()->Global(), fn, 0, 0);
该函数被正确调用,并且我在 C++ 端收到了承诺
v8::Handle<v8::Promise> promiseReturnObject =
v8::Handle<v8::Promise>::Cast ( value.ToLocalChecked() );
然后我可以使用检查承诺的状态
v8::Promise::PromiseState promiseState = promiseReturnObject->State();
当然,当时承诺仍在等待中,我无法访问它的结果。到目前为止,我发现接收该承诺结果的唯一方法是Then
使用promiseReturnObject
.
promiseReturnObject->Then(Nan::GetCurrentContext(), callbackFn);
有没有办法在调用的函数范围内同步fn
检索结果?我已经尝试使用std::promise
并将它作为data
参数传递给v8::FunctionTemplate
of ,但是在相应的块上callbackFn
调用wait
or执行并且承诺永远不会实现。我需要求助于回调吗?get
std::future
任何关于如何设置它的帮助或想法将不胜感激。
解决方案
我从https://github.com/nodejs/node/issues/5691得到了一个答案
if (result->IsPromise()) {
Local<Promise> promise = result.As<Promise>();
if (promise->HasHandler()) {
while (promise->State() == Promise::kPending) {
Isolate::GetCurrent()->RunMicrotasks();
}
if (promise->State() == Promise::kRejected) {
Nan::ThrowError(promise->Result());
}
else
{
// ... procses promise->Result() ...
}
}
}
推荐阅读
- javascript - 如何使用库或 OOTP JS 格式化没有空/零部分和缩写单位(例如“1 min 0 sec”->“1 min”)的 javascript 日期/时间持续时间?
- javascript - 如何在我的 React 组件中打印出行和列
- regex - 正则表达式匹配某个单词之前的所有内容
- matplotlib - Matplotlib“无法确定主目录”问题在 MSYS2/MinGW 中使用 PyInstaller
- jdbc - Kafka JDBC 源连接器和 Oracle 数据库错误
- c# - 使用 c# 和 html 在 aspx 页面中发出编程关闭按钮
- css - 未知属性“-moz-binding”。声明被删除
- git - git - 是否可以在不推送/获取整个文件夹的情况下将某些文件推送/获取到 git?
- python - 快捷方式脚本中的 EOFError:Python 中的(原始)键盘输入
- c++ - 使用 ifstream 提取变量数据时如何将单词与数字分开?