Как сделать синхронный вызов через QWebChannel

Я портирую код из QWebKit в QWebEngine, и у меня возникают проблемы из-за того, чтоQWebChannel асинхронный.

Код Javascript в QWebView/QWebEngineViewнеобходимо запросить код C++ для абзацев текста и добавить этот текст, пока на странице не останется места. Псевдокод для версии WebKit выглядит так:

while (there_is_space_left) {
    var par = channel_to_cpp_code.getNextParagraph();
    addParagraph(par);
}

Этот код синхронный и работает очень хорошо. Код для версии WebEngine не может использовать цикл, потому что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? Есть ли идиоматические шаблоны для решения проблемы, которую я решаю?

0 ответов

Другие вопросы по тегам