Coldfusion - 如何实时更新表格单元格?

时间:2013-08-20 03:53:57

标签: c# coldfusion websocket coldfusion-10

我对ColdFusion相对较新(使用ColdFusion 10),我对创建实时更新表有疑问。

目前我有一个C#应用程序,我每隔2秒就将股票价格写入csv(文本)文件,并希望在网页上的表格中反映这些变化。我知道我可以每2秒刷新整个表,但这会产生很多请求到服务器,我想知道是否有更好的方法吗?使用ColdFusion 10的新html5 Web套接字功能可以轻松实现这一点吗?

任何有关如何进行或如何实现这一目标的建议/指导将不胜感激!

谢谢,AlanJames。

2 个答案:

答案 0 :(得分:1)

我认为你可以改写你的问题,并在第一个小时内获得至少5个答案。

现在回答它,如果我很清楚你在问什么。

目前还没有IMHO网页套件,如果您的网站用户人数众多且您不能100%确定他们会使用最新的Chrome或FF,请忘掉它。

您可以使用一些javascript websocket库,它可以优雅地回退到Flash或AJAX HTTP轮询,如http://socket.io/或像pusher.com这样的云服务。但是这会使你的生活变得复杂,因为如果你实现轮询和websocket,你在后端的工作量会增加2-3倍。

关于请求数量,如果您想在屏幕上显示实时数据,则必须有服务器来支持它。

如果您请求一次并刷新所有表的数据,则可以进行优化,因此不是每个单元格。您将立即获得所有新数据并更新那些使用jquery更改的单元格。所以不要再次提取所有数据,或者整个表格HTML,只需要最少量的数据。

AJAX轮询肯定会对请求数量有所帮助,但请求打开的时间是另一个可能的问题。您可以使用BlazeDS进行轮询,即使在ColdFusion 9中也是如此。

要查看的一些页面:

http://www.bennadel.com/blog/2351-ColdFusion-10-Using-WebSockets-To-Push-A-Message-To-A-Target-User.htm

http://www.bennadel.com/blog/1956-Very-Simple-Pusher-And-ColdFusion-Powered-Chat.htm

http://nil.checksite.co.uk/index.cfm/2010/1/28/CF-BlazeDS-AJAX-LongPolling-Part1

答案 1 :(得分:0)

如果没有从您的网页向您的服务器发出某种请求,则无法每2秒获取实时更新,否则如果有任何更改,它将如何知道?

就个人而言,我会编写一个CFC方法来读取你的文本文件并查看它是否已被更改,然后每隔几秒使用jQuery轮询该方法以返回它是否已更改,并传回任何更新的内容。

在不知道文本文件等细节的情况下,很难写出任何准确的内容。从根本上说,您的CFC方法必须存储(可能在SESSION var中)文本文件数据的副本,因此它可以将其与最新的读入数据进行比较,并判断是否有任何更改。如果它已经改变,那么发送一个带有更新的结构,或者返回一个响应,说明它没有改变。

您的CFC代码如下所示:

<cffunction name="check_update" access="remote" output="false">
    <cfset response = structNew()>
    <cffile action="read"
        file="path\to\your\textfile.txt" 
        variable="file_content"
    >
    <cfif file_content NEQ SESSION.file_content>
        <cfset response.updated = true>
        <cfset SESSION.file_content = file_content>
        <cfset response.content = structNew()>

        <!--- code here to populate 'content' variable with updated info --->

    <cfelse>
        <cfset response.updated = false>
    </cfif>
    <cfreturn response>
</cffunction>

然后用于轮询该数据的jQuery代码如下所示:

var update_interval;
var update_pause = 3000;

function check_update() {
    var request = {
        returnformat : 'json', 
        queryformat : 'column',
        method: 'check_update'
    }
    $.getJSON("path/to/your/service.cfc", request, function(data) {
        if(data.UPDATED == true) {
            /* code here to iterate through data.CONTENT */
            /* and render out your updated info to your table */
        }
    });
}

$(document).ready(function () {
    update_interval = setInterval(check_update(), update_pause);
});

因此,一旦DOM准备就绪,我们创建一个间隔,在这种情况下每隔3秒(3000ms)触发一次并调用check_update()函数。该函数调用您的CFC,并检查响应。如果响应UPDATED值为true,则它会运行任何代码来呈现您的更新。

这是实现您所需要的最直接的方法,无论浏览器如何都应该有效。根据我的经验,轮询像这样的CFC的开销确实非常小,而且你传输的数据量很小,因此应该没有问题。

我认为没有任何其他方法可以更轻巧/易于组合。长轮询或SSE(具有狡猾的浏览器支持)的好处可以忽略不计,不值得编程开销。

谢谢,亨利