Thanks for the pointer Ben. I encountered another issue while following 
your suggestion:

For evaluating the script "new Promise(() => {})", I'd expect 
result->IsPromise() is true. However, in some cases I'm seeing 
result->IsPromise() is false if some code are executed before.

I don't have a small example as I couldn't pinpoint the issue. But I'll see 
this issue if I execute the tensorflow.js source code (from 
https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.4.0/dist/tf.js) before the 
promise, in which case I'll see result->IsPromise() is false. However, when 
I print the status from v8::String::Utf8Value(isolate, 
result->ToDetailString(context).ToLocalChecked()), it still outputs 
"#<Promise>". So I'm confused.

It seems that the execution of tensorflow.js is interfering with something, 
but I'm not sure how to debug. FYI, I *think* the execution of 
tensorflow.js succeeded, because I saw no compile/run error, and after that 
I could still compile/run some tensorflow functions, or just compile/run 
some other toy functions. It's just that a promise is no longer evaluated 
to be a promise.

Any ideas why this happens?

On Wednesday, September 16, 2020 at 3:35:10 AM UTC-4, Ben Noordhuis wrote:
>
> On Wed, Sep 16, 2020 at 8:56 AM Yao Xiao <yao...@chromium.org 
> <javascript:>> wrote: 
> > 
> > Hi v8-users, 
> > 
> > I'm new to v8. 
> > 
> > For a "script" that has a call to a sync function that returns an 
> integer, I figured I could do the following to get the result in C++: 
> > 
> > v8::Local<v8::Value> result = script->Run(context).ToLocalChecked(); 
> > int result_int = result->Int32Value(context).FromJust(); 
> > 
> > I'm wondering if there's a way to get (i.e. make C++ aware of) the 
> return value an async function? I tried to use await but it seems that the 
> script won't compile. 
>
> You can attach your own .then and .catch callbacks if the script's 
> return value is a promise (which is what the return value of an async 
> function really is): 
>
>   if (result->IsPromise()) { 
>     Local<Promise> promise = result.As<Promise>(); 
>     if (promise->State() == Promise::kPending) { 
>       Local<Function> resolve = Function::New(context, 
> Resolve).ToLocalChecked(); 
>       Local<Function> reject = Function::New(context, 
> Reject).ToLocalChecked(); 
>       promise = promise.Then(resolve, reject).ToLocalChecked(); 
>   } else { 
>     result = promise->Result();  // note: distinguish between 
> kFulfilled and kRejected 
>     // ... 
>   } 
>
> You'll need to pump the event loop and/or the microtask queue in order 
> for the promise to resolve. 
>
> Apropos the await keyword, that isn't accepted at the top-level scope 
> (outside an async function) unless you're executing the script as an 
> ES module and the --harmony_top_level_await flag is set. 
>

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-users/44701b3e-1bbf-4941-8644-d0b5b8e519a0o%40googlegroups.com.

Reply via email to