V8 обещание ', затем' вызывается только в случае разрешения в конструктореC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 V8 обещание ', затем' вызывается только в случае разрешения в конструкторе

Сообщение Anonymous »

У меня есть следующая проблема с совместимостью 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>


Подробнее здесь: [url]https://stackoverflow.com/questions/79571464/v8-promise-then-is-called-only-if-resolved-in-constructor[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»