Я пытаюсь вызвать 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
блокирует выполнение, и обещание никогда не выполняетсявыполнено.Нужно ли прибегать к обратным вызовам?
Буду очень признателен за любую помощь или идею о том, как мне это настроить.