首页 > 解决方案 > 原生 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::FunctionTemplateof ,但是在相应的块上callbackFn调用waitor执行并且承诺永远不会实现。我需要求助于回调吗?getstd::future

任何关于如何设置它的帮助或想法将不胜感激。

标签: c++node.jspromisev8

解决方案


我从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() ...
      }
    }
  }

推荐阅读