(решение в обновлении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++
Программы на C++. Форум разработчиков
1744623822
Anonymous
(решение в обновлении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>
Подробнее здесь: [url]https://stackoverflow.com/questions/79571464/v8-promise-then-is-called-only-if-resolved-in-constructor[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия