【问题标题】:Native v8::Promise Result原生 v8::Promise 结果
【发布时间】:2019-04-29 01:05:24
【问题描述】:

我正在尝试使用 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();

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

promiseReturnObject->Then(Nan::GetCurrentContext(), callbackFn);

有没有办法在调用fn 的函数范围内同步 检索该结果?我尝试使用std::promise 并将其作为v8::FunctionTemplatecallbackFndata 参数传递给wait,但在各自的std::future 上调用waitget 会阻止执行并且承诺永远不会履行。我需要求助于回调吗?

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

【问题讨论】:

    标签: c++ node.js promise v8


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 2015-10-06
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多