【发布时间】: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::FunctionTemplate 的callbackFn 的data 参数传递给wait,但在各自的std::future 上调用wait 或get 会阻止执行并且承诺永远不会履行。我需要求助于回调吗?
任何关于如何设置的帮助或想法将不胜感激。
【问题讨论】: