首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >原生V8:承诺结果

原生V8:承诺结果
EN

Stack Overflow用户
提问于 2018-11-27 10:04:50
回答 1查看 1.3K关注 0票数 3

我试图使用v8/非数从C++调用JS-函数,这反过来又返回了一个承诺。

假设我有一个通用的Nan回调

代码语言:javascript
运行
复制
Nan::Callback fn

然后,我使用以下代码调用此函数

代码语言:javascript
运行
复制
Nan::AsyncResource resource(Nan::New<v8::String>("myresource").ToLocalChecked());
Nan::MaybeLocal<v8::Value> value = resource.runInAsyncScope(Nan::GetCurrentContext()->Global(), fn, 0, 0);

函数被正确调用,我在C++端收到了承诺

代码语言:javascript
运行
复制
v8::Handle<v8::Promise> promiseReturnObject = 
v8::Handle<v8::Promise>::Cast ( value.ToLocalChecked() );

然后,我可以使用

代码语言:javascript
运行
复制
v8::Promise::PromiseState promiseState = promiseReturnObject->State();

当然,当时承诺还未兑现,我无法访问它的结果。到目前为止,我发现接收该承诺的结果的唯一方法是在Then上使用promiseReturnObject方法。

代码语言:javascript
运行
复制
promiseReturnObject->Then(Nan::GetCurrentContext(), callbackFn);

是否有任何方法可以在调用的函数的作用域中同步恢复结果?我尝试使用std::promise并将其作为data参数传递给v8::FunctionTemplate of callbackFn,但是在相应的std::future上调用waitget会阻止执行,并且承诺永远不会实现。我需要打电话吗?

任何帮助或想法,我可以如何设置这将是非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2019-05-03 07:14:23

我从https://github.com/nodejs/node/issues/5691得到了一个答案

代码语言:javascript
运行
复制
  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() ...
      }
    }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53497160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档