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.