Html 如何在仍在cfscript中时将输出获取到网页?

Html 如何在仍在cfscript中时将输出获取到网页?,html,coldfusion,flush,cfml,lucee,Html,Coldfusion,Flush,Cfml,Lucee,对不起,这篇文章太长了,我想说得具体一点。我是冷聚变和lucee的新手,所以如果我错过了一些基本的东西,请原谅我。我只是想做一个快速的POC,但无法让它工作。我想做的是打一个页面电话,写一个网页,睡一会儿。有点心跳。在所有睡眠发生并且页面cfm文件完成处理之前,我无法写入网页。在过去的几天里,我进行了广泛的搜索,尝试了许多项目,但都没有成功。在我的index.cfm lucee页面上,我有一个链接,可以启动一个新选项卡并调用我的cfm文件。 这里没有问题,一个新选项卡打开,pinger2.cf

对不起,这篇文章太长了,我想说得具体一点。我是冷聚变和lucee的新手,所以如果我错过了一些基本的东西,请原谅我。我只是想做一个快速的POC,但无法让它工作。

我想做的是打一个页面电话,写一个网页,睡一会儿。有点心跳。在所有睡眠发生并且页面cfm文件完成处理之前,我无法写入网页。在过去的几天里,我进行了广泛的搜索,尝试了许多项目,但都没有成功。

在我的index.cfm lucee页面上,我有一个链接,可以启动一个新选项卡并调用我的cfm文件。

这里没有问题,一个新选项卡打开,pinger2.cfm开始处理。 我所希望的是,表格标题几乎立即打印到页面上,然后进行第一次调用,将结果打印到页面上,然后睡觉,进行下一次调用,打印到页面上……但这不起作用。有人有线索吗?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>

公共结构函数pinger(必需的字符串url、必需的字符串谓词、必需的数字超时、结构体)
{
var结果={
成功=错误,
errorMessage=“”
};
var httpService=newhttp();
setMethod(arguments.verb);
setUrl(arguments.url);
setTimeout(arguments.timeout);
if(arguments.verb==“post”| | arguments.verb==“put”)
{
httpService.addParam(type=“body”,value=SerializeJSON(arguments.body));
}
试一试{
callStart=getTickCount();
var resultObject=httpService.send().getPrefix();
callEnd=getTickCount();
callLength=(callEnd callStart)/1000;
if(已定义(“resultObject.status_代码”)&&resultObject.status_代码==200)
{
result.success=true;
logMessage=“Pinger take”&toString(callLength)和“seconds.”;
outLine=“&resultObject.charset&&&resultObject.http&&resultObject.mimetype&&resultObject.status&&code&&resultObject.status&&text&&resultObject.statuscode&&logMessage&”;
写输出(大纲);
getPageContext().getOut().flush();
返回结果;
}
其他的
{
抛出(“返回的状态代码”和resultObject.Status_代码);
}
}
捕获(任何e){
//请求出了问题
书面文件(e);
中止
}
}
outLine=“charset http\u version mimetype status\u code status\u text statuscode time”;
写输出(大纲);
getPageContext().getOut().flush();
intCounter=0;
while(内部计数器LT 2)
{
响应=pinger(
url=”https://www.google.com",
动词=“GET”,
超时=5
);
intCounter=intCounter+1;
getPageContext().getOut().flush();
睡眠(2000年);
}
大纲=”;
写输出(大纲);
注意:我肯定还有其他“不太好”的做法,但我只是想快速而肮脏地做到这一点。

我认为
getPageContext().getOut().flush()
会起作用,但没有bueno。


编辑:如果有必要的话,我正在使用CF版本10,0,0,0和Lucee版本4.5.2.018。

我做了一些类似的事情来手动生成ETag(使用Lucee 4.5)。我坚持一个简单的原则

GetPageContext().getOut().getString()

在Application.cfc中的
onRequestEnd
函数中。这将返回一个HTML字符串,就像发送到浏览器一样


您可以将其存储在适当的范围(应用程序、会话等)中,稍后再使用,或者根据需要使用它。显然,所有处理都需要完成,但不需要任何刷新。事实上,刷新可能会也可能不会改变其行为。

要将缓冲区的内容刷新到输出流,您应该能够调用
cfflush
的cfscript版本,该版本就是
flush
此外,在about中,您可以使用cfscript版本的
cfhttp
,例如
httpurl=“…”method=“…”,等等。。。但那是Lucee特有的,与ACF不兼容。我也试过了,没用。我也用冲水;脸红(标题和正文),但这不起作用。您还需要确保刷新足够,以便浏览器能够实际渲染。->然而,一旦我更新到railo,现在是lucee,这对我来说也不再适用。我只是没有调查原因,因为这还不是一个问题。您使用的是哪台web服务器,它是如何连接到您的Lucee/ACF服务器的?这可能会影响刷新操作@肖恩·霍格,为什么是这样?我试图在处理过程中将信息显示在屏幕上。在这种情况下,这不可能吗?这可能是可能的,但可能需要一个不同的标签。据我所知,这些方法只有在页面完全呈现为HTML并准备好发送给客户端之后才可用。也就是说,你可以早点打电话给它,它可能会返回它所拥有的(我面前没有文档)。我的猜测是不会的,如果我明白你想做什么,你就得做点什么。