我对ColdFusion相对较新(使用ColdFusion 10),我对创建实时更新表有疑问。
目前我有一个C#应用程序,我每隔2秒就将股票价格写入csv(文本)文件,并希望在网页上的表格中反映这些变化。我知道我可以每2秒刷新整个表,但这会产生很多请求到服务器,我想知道是否有更好的方法吗?使用ColdFusion 10的新html5 Web套接字功能可以轻松实现这一点吗?
任何有关如何进行或如何实现这一目标的建议/指导将不胜感激!
谢谢,AlanJames。
答案 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/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(具有狡猾的浏览器支持)的好处可以忽略不计,不值得编程开销。
谢谢,亨利