【问题标题】:Coldfusion - How to update Table Cells in Real time?Coldfusion - 如何实时更新表格单元格?
【发布时间】:2013-08-22 00:16:03
【问题描述】:

我对 ColdFusion 比较陌生(使用 ColdFusion 10),我有一个关于创建实时更新表的问题。

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

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

谢谢,艾伦詹姆斯。

【问题讨论】:

    标签: c# coldfusion websocket coldfusion-10


    【解决方案1】:

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

    现在回答这个问题,如果我明白你在问什么。

    恕我直言,websockets 还没有,如果您的网站是面向广大用户的,并且您不能 100% 确定它们是否带有最新的 Chrome 或 FF,请忘记它。

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

    关于请求的数量,如果你想要屏幕上的实时数据,你必须有服务器来支持它。

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

    AJAX 轮询肯定有助于处理请求数量,但请求打开的时间是另一个可能的问题。您甚至可以使用 ColdFusion 9 中的 BlazeDS 进行轮询。

    一些要查看的页面:

    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

    【讨论】:

    • 非常感谢您花时间回答 Zarko。您的回答非常有用。在尝试寻找方向时,我还遇到了 HTML5 服务器发送事件,它看起来非常适合这种情况,因为我只需要从服务器到客户端的一个方向流动的信息。问题又是,与 websockets 一样(正如您在上面指出的那样),除非您的访问者拥有最新的浏览器,否则它将无法正常工作!
    • 我想我可能会继续尝试使用服务器发送事件,如果用户浏览器不支持它,我会退回到长轮询。如果有人感兴趣,这里有一些关于服务器发送事件的信息 - html5rocks.com/en/tutorials/eventsource/basics/…html5doctor.com/server-sent-eventssagarganatra.com/2011/01/server-sent-events-with-html5-and.html
    【解决方案2】:

    如果不从您的页面向服务器发出某种请求,就无法每 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 秒(3000 毫秒)触发一次,并调用 check_update() 函数。该函数调用您的 CFC,并检查响应。如果响应 UPDATED 值为 true,那么它会运行任何代码来呈现您的更新。

    这是实现您需要的最直接的方法,并且无论使用哪种浏览器都应该有效。根据我的经验,像这样轮询 CFC 的开销确实非常小,而且您传输的数据量也很小,因此处理起来应该没有问题。

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

    谢谢,亨利

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多