Я портирую код с QWebKit на QWebEngine , и у меня возникают проблемы из-за того, что QWebChannel
асинхронен.
Javascript код в QWebView
/ QWebEngineView
должен запросить код C ++ для абзацев текста и добавить этот текст, пока на странице не останется места. Псевдокод для версии WebKit выглядит так:
while (there_is_space_left) {
var par = channel_to_cpp_code.getNextParagraph();
addParagraph(par);
}
Этот код синхронный и работает довольно хорошо. Код для версии WebEngine не может использовать l oop, потому что channel_to_cpp_code
основан на QWebChannel
и поэтому является асинхронным (вот псевдокод, который использует рекурсию):
function maybeAddParagraphAndRepeat() {
if (there_is_space_left) {
channel_to_cpp_code.getNextParagraph()
.then(function(par) {
addParagraph(par);
maybeAddParagraphAndRepeat();
});
}
}
Этот подход намного медленнее , особенно в режиме отладки. Узким местом является цепочка асинхронных вызовов (даже если getNextParagraph
возвращает жестко запрограммированную строку). С другой стороны, я не знаю, сколько абзацев потребуется для заполнения страницы, поэтому я не могу запросить все данные заранее.
Итак, общий вопрос: что делать в моем кейс. Можно ли использовать QWebChannel
синхронно? Есть ли другие способы вызвать код C ++ из WebEngineView
? Существуют ли идиоматические c паттерны для решения проблемы, которую я решаю?