Native v8 :: Обещание Результат - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь вызвать JS-функцию из C ++, используя v8 / Nan , которая, в свою очередь, возвращает 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 из callbackFn, но вызов wait или get для соответствующего std::future блокирует выполнение, и обещание никогда не выполняетсявыполнено.Нужно ли прибегать к обратным вызовам?

Буду очень признателен за любую помощь или идею о том, как мне это настроить.

1 Ответ

0 голосов
/ 03 мая 2019

Я получил ответ от 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() ...
      }
    }
  }
...