(решение в обновлении1)
У меня есть следующая проблема с совместимостью C ++ /V8. Когда я разрешаю обещание вне конструктора, тогдашний обратный вызов никогда не вызывается. Вот код JavaScript V8: < /p>
'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>
Существует функция конструктора, предоставленная < /p>
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;
И вот как он решается, см. CPP2V8 :: Resolver-> Resiple в конце. {
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>
В вышеуказанном коде, затем < /code> никогда не вызывается.
Когда я разрешаю функцию в конструкторе, все в порядке, а затем < /code> обратный вызов называется: < /p>
< /p>
Подробнее здесь: https://stackoverflow.com/questions/795 ... onstructor
V8 обещание ', затем' вызывается только в случае разрешения в конструкторе ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
V8 обещание ', затем' вызывается только в случае разрешения в конструкторе
Anonymous » » в форуме C++ - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-
-
-
V8 обещание ', затем' вызывается только в случае разрешения в конструкторе
Anonymous » » в форуме C++ - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
V8 обещание ', затем' вызывается только в случае разрешения в конструкторе
Anonymous » » в форуме C++ - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
V8 обещание ', затем' вызывается только в случае разрешения в конструкторе
Anonymous » » в форуме C++ - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как отклонить обещание Javascript с `typeerror`, вызывая функцию разрешения?
Anonymous » » в форуме Javascript - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-