我试图使用v8/非数从C++调用JS-函数,这反过来又返回了一个承诺。
假设我有一个通用的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);是否有任何方法可以在调用的函数的作用域中同步恢复结果?我尝试使用std::promise并将其作为data参数传递给v8::FunctionTemplate of callbackFn,但是在相应的std::future上调用wait或get会阻止执行,并且承诺永远不会实现。我需要打电话吗?
任何帮助或想法,我可以如何设置这将是非常感谢。
发布于 2019-05-03 07:14:23
我从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() ...
}
}
}https://stackoverflow.com/questions/53497160
复制相似问题