Как мне получить вывод на веб-страницу, пока она еще находится внутри cfscript?

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

То, что я пытаюсь сделать, это сделать вызов страницы, написать на веб-страницу, поспать некоторое время. Вид сердцебиения. Чего я не могу добиться, так это записи на веб-страницу... пока не будут выполнены все спящие режимы, и файл cfm страницы не завершит обработку. Последние несколько дней я много смотрел и много раз пробовал, но безрезультатно.

На моей странице ind ex.cfm lucee у меня есть ссылка для запуска новой вкладки и вызова моего файла cfm.
<a href="./pinger2.cfm" target="_blank"><img class="ploverride" src="/assets/img/Ping.png" alt="Ping Test" width="125" height="75">
Здесь нет проблем, открывается новая вкладка и начинается обработка pinger2.cfm. Я надеюсь, что заголовок таблицы почти сразу печатает на страницу, затем выполняет первый вызов, выводит результаты на страницу, спит, делает следующий вызов, печатает на страницу... но это не так. workey. У кого-нибудь есть подсказка? Код в файле pinger2.cfm:

<cfscript>
    public struct function pinger( required string url, required string verb, required numeric timeout, struct body )
    {
        var result = {
            success = false,
            errorMessage = ""
        };
        var httpService = new http();
        httpService.setMethod( arguments.verb );
        httpService.setUrl( arguments.url );
        httpService.setTimeout( arguments.timeout );
        if( arguments.verb == "post" || arguments.verb == "put" )
        {
            httpService.addParam(type="body", value=SerializeJSON(arguments.body));
        }
        try {
            callStart = getTickCount();
            var resultObject = httpService.send().getPrefix();
            callEnd = getTickCount();
            callLength = (callEnd-callStart)/1000;
            if( isDefined("resultObject.status_code") && resultObject.status_code == 200 )
            {
                result.success = true;
                logMessage = "Pinger took " & toString( callLength ) & " seconds.";
                outLine = "<tr><td>" & resultObject.charset &  "</td><td>" & resultObject.http_version  & "</td><td>" & resultObject.mimetype  & "</td><td>" & resultObject.status_code  & "</td><td>" & resultObject.status_text  & "</td><td>" & resultObject.statuscode  & "</td><td>" & logMessage & "</td></tr>";
                writeOutput( outLine );
                getPageContext().getOut().flush();
                return result;
            }
            else
            {
                throw("Status Code returned " & resultObject.status_code);
            }
        }
        catch(Any e) {
            // something went wrong with the request
            writeDump( e ); 
            abort;
        }
    }
    outLine = "<table><tr><th>charset</th>  <th>http_version</th>     <th>mimetype</th>      <th>status_code</th>      <th>status_text</th>      <th>statuscode</th>      <th>time</th> </tr>";
    writeOutput( outLine );
    getPageContext().getOut().flush();
    intCounter = 0;
    while(intCounter LT 2) 
    {
        theResponse = pinger(
            url = "https://www.google.com",
            verb = "GET",
            timeout = 5
        );
        intCounter = intCounter + 1;
        getPageContext().getOut().flush();
        sleep(2000);
    }
outLine = "</table>";
writeOutput( outLine );
</cfscript>

ПРИМЕЧАНИЕ: я уверен, что там есть и другие "менее чем лучшие" практики, но я просто пытаюсь сделать это быстро и грязно.

Я думал getPageContext().getOut().flush(); сделал бы трюк, но не Буэно.

РЕДАКТИРОВАТЬ: Если это имеет значение, я использую CF версии 10,0,0,0 и Lucee версии 4.5.2.018.

1 ответ

Решение

Я делаю что-то похожее, чтобы генерировать ETag вручную (используя Lucee 4.5). Я придерживаюсь простого

GetPageContext().getOut().getString()

в onRequestEnd функция в Application.cfc. Это возвращает строку HTML так же, как она отправлена ​​в браузер.

Вы можете хранить это в соответствующем объеме (ЗАЯВКА, СЕССИЯ и т. Д.) И использовать его позже, или все, что вам нужно. Очевидно, что вся обработка должна быть завершена, но она не должна требовать каких-либо сбросов. На самом деле, промывка может или не может изменить свое поведение.

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