Нужна помощь в настройке сна для задержки следующего запроса в цикле с coldfusion

Я работаю с Coldfusion 11. У меня есть мессенджер, который использует метаобновление, которое обновляет страницу каждые 30 секунд, чтобы получать новые мгновенные сообщения. Проблема с этим - вспышка перезагрузки страницы, и мне бы очень хотелось, чтобы она обновлялась каждые 15 секунд. Я решил попробовать измениться и использовать цикл для проверки любых невидимых сообщений. Если он есть, он перезагрузит страницу. Если нет, я хочу, чтобы он спал в течение 15 секунд, прежде чем продолжить цикл. Как видите, я устанавливал это 40 раз. С 15-секундными интервалами время ожидания истекает через 10 минут. Если пользователь не опубликовал новое сообщение или не изменил страницу в этот момент, мы считаем, что он вышел из системы. Код ниже находится в конце страницы. Проблема, с которой я сталкиваюсь, заключается в том, что сообщения не отображаются до завершения cloop. Есть ли способ настроить цикл для работы в фоновом режиме, но отображать текущие сообщения?

<cfloop from="1" to="40" index="i">
<cfset sleep(15000)> 
<cfquery name="messck" datasource="mysource" maxrows="1">
SELECT id
FROM messages
WHERE user = '#getuser.code#' AND friend = '#getme.code#' AND seendate IS NULL
ORDER BY ID DESC
</cfquery>
<cfif messck.recordcount EQ 0>
<cfelse>
<cflocation url="messagebox.cfm?code=#url.code#">
</cfif>
</cfloop>

Спасибо, Майк


person Mike    schedule 14.05.2014    source источник
comment
Думали ли вы об использовании AJAX для загрузки новых сообщений вместо обновления всей страницы? Или вы можете использовать веб-сокеты.   -  person Scott Stroz    schedule 15.05.2014
comment
После написания изменения кода я понял, что CF будет выполнять весь цикл, включая сон, перед отображением страницы. Я мало работал с веб-сокетами. Время сделать домашнее задание.   -  person Mike    schedule 15.05.2014
comment
Для одновременной активности также есть cfthread.   -  person Dan Bracuk    schedule 15.05.2014
comment
Вы много работали с AJAX (может быть, это более простое решение для реализации, чем веб-сокеты, хотя веб-сокеты - это круто)? Вы можете настроить JS-функции для вызова через определенные промежутки времени. Вы можете использовать это для выполнения вызовов AJAX и получения новых сообщений (скажем, каждую минуту), а затем использовать ответ для заполнения окна чата. Вам не нужно обновлять всю страницу.   -  person Scott Stroz    schedule 15.05.2014


Ответы (2)


Я решил использовать JQuery с функцией Ajax, и это отлично решило мою проблему. Я включил пару ссылок на скрипт на страницу с сообщениями, messages.cfm

<script language="javascript" src="http://equifax.ipushjobs.com/jquery/jquery-1.2.6.min.js"></script>
<script language="javascript" src="http://equifax.ipushjobs.com/jquery/jquery.timers-1.0.0.js"></script>

Потом добавил этот скрипт.

<script language="javascript">
$(document).ready(function(){
  var j = jQuery.noConflict();
j(document).ready(function()
{
    j(".refreshMe").everyTime(5000,function(i){
        j.ajax({
          url: "messck.cfm?code=#getuser.code#",
          cache: false,
          success: function(html){
            j(".refreshMe").html(html);
          }
        })
    })
});
  j('.refreshMe').css({color:"red"});
});
</script>

Затем я поместил пустой div в конец страницы.

<div class="refreshMe"></div>

Это мой messck.cfm. Он проверяет наличие нового сообщения от пользователя. Если есть новое сообщение, страница обновляется.

<cfquery name="ckfornew" datasource="mysource">
SELECT code
FROM messages
WHERE code = '#url.code#' AND friend = '#session.code#' AND seendate IS NULL
ORDER BY ID DESC
</cfquery>
<cfif ckfornew.recordcount EQ 0>
<cfelse>
<cfoutput>
<meta http-equiv=Refresh content="0;url=messages.cfm?code=#ckfornew.code#">
</cfoutput>
</cfif>

Я ценю вклад и направление!

person Mike    schedule 15.05.2014
comment
Возможно, я сказал слишком рано. Он отлично работает в Chrome. Однако IE 11 не очень доволен этим. Скрипт не срабатывает. - person Mike; 15.05.2014

Вы должны иметь возможность использовать <cfflush> для периодического возврата контента с сервера.

person Russ    schedule 15.05.2014