Code: Select all
'use strict';
v8log ("******** C++ Promise start ********");
const promiseFromCpp = new GetCppPromise();
v8log ("promise created");
promiseFromCpp.then(value => {
v8log ("C++::GetCppPromise()::Resolve->v8::then ", value);
}).catch(error => {
v8log (error);
});
v8log ("******* C++ Promise end ********");
< /code>
Es gibt eine Konstruktorfunktion, die < /p>
bereitgestellt wird.class cpp2v8
{
public:
static v8::Local resolver;
static void getNewPromise(const v8::FunctionCallbackInfo& args) {
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope handle_scope(isolate);
v8::Local context = isolate->GetCurrentContext();
resolver = v8::Promise::Resolver::New(context).ToLocalChecked();
v8::Local promise = resolver->GetPromise();
args.GetReturnValue().Set(promise);
}
};
v8::Local cpp2v8::resolver;
Code: Select all
{
v8::Isolate::Scope isolate_scope(isolate);
v8::HandleScope handle_scope(isolate);
v8::Local global = v8::ObjectTemplate::New(isolate);
v8api::registerLogToConsole(isolate, global);
//provide constructor function here
global->Set(v8::String::NewFromUtf8(isolate, "GetCppPromise").ToLocalChecked(), v8::FunctionTemplate::New(isolate, cpp2v8::getNewPromise));
v8::Local context = v8::Context::New(isolate, nullptr, global);
v8::Context::Scope context_scope(context);
context->Global();
// JavaScript code to create and use a Person object
const char* source = R"(
'use strict';
v8log ("******** C++ Promise start ********");
const promiseFromCpp = new GetCppPromise();
v8log ("promise created");
promiseFromCpp.then(value => {
v8log ("C++::GetCppPromise()::Resolve->v8::then ", value);
}).catch(error => {
v8log (error);
});
v8log ("******* C++ Promise end ********");
)";
v8::Local source_str = v8::String::NewFromUtf8(isolate, source).ToLocalChecked();
v8::Local script = v8::Script::Compile(context, source_str).ToLocalChecked();
script->Run(context).ToLocalChecked();
cpp2v8::resolver->Resolve(context, v8::String::NewFromUtf8(isolate, "Promise resolved outside!").ToLocalChecked()).FromJust();
< /code>
Im obigen Code wird < /code> nie aufgerufen.class cpp2v8
{
public:
static void getNewPromise(const v8::FunctionCallbackInfo& args) {
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope handle_scope(isolate);
v8::Local context = isolate->GetCurrentContext();
v8::Local resolver = v8::Promise::Resolver::New(context).ToLocalChecked();
v8::Local promise = resolver->GetPromise();
//Resolve here, in constructor
resolver->Resolve(context, v8::String::NewFromUtf8(isolate, "Promise resolved in C++!").ToLocalChecked()).FromJust();
args.GetReturnValue().Set(promise);
}
v8: ******** C++ Promise start ********
v8: promise created
v8: ******* C++ Promise end ********
v8: C++::GetCppPromise()::Resolve->v8::then Promise resolved in C++!
< /code>
Hier ist das Problem. Ich möchte das Versprechen nicht im Konstruktor lösen. Ich möchte es Anywhere im Code bei in jeder anderen Zeit beheben, das ist meiner Meinung nach genau das Gefühl eines Versprechens. Wie genau kann ich das machen?