原型Ajax.PeriodicalUpdater在服务器无法访问时插入空字符串

时间:2009-01-13 15:08:23

标签: ajax prototypejs

我正在使用以下内容获取一些更新的HTML并将其插入到ID为“content”的div中

var updater = new Ajax.PeriodicalUpdater('content', '/Doc?'+d.getTime(),
  {
    method: 'post',
    frequency: 5,
  });

问题在于,当服务器关闭时(它正在修改并提升数据的应用程序内部运行),更新程序会简单地清除内容div。

有没有办法让它当PeriodicalUpdater超时,得到404等等时它只是保持内容不变?我希望最后可用的数据保留在那里,而不是被删除。


为了完整性,这是我的整个代码:

<html>
<head>
<title></title>
<script type="text/javascript" src="/Prototype"></script>
<script type="text/javascript">
var css;
var css_data;

function load_content()
{
  var d = new Date();

  css = document.createElement('style');
  css.setAttribute('type', 'text/css');
  if(css.styleSheet) { css.styleSheet.cssText = '';} //Because IE is evil
  else { css_data = document.createTextNode(''); css.appendChild(css_data); } //And everyone else is cool
  document.getElementsByTagName("head")[0].appendChild(css);

  var updater = new Ajax.PeriodicalUpdater({success: 'content'}, '/%doc_path%?'+d.getTime(),
  {
    method: 'post',
    frequency: 5,
    onSuccess: function(transport) {
          new Ajax.Request('/%css_path%?'+d.getTime(), {
              method: 'post',
              onSuccess: function(transport) {
                if(css.styleSheet) { css.styleSheet.cssText = transport.responseText}
                else { 
                    var new_css_data = document.createTextNode(transport.responseText);
                    css.replaceChild(new_css_data, css_data); 
                    css_data = new_css_data;
                } 
              }
          });
          new Ajax.Request('/%title_path%?'+d.getTime(), {
              method: 'post',
              onSuccess: function(transport) {
                document.title = transport.responseText;
              }
          });
    }
  });
}

</script>

</head>

<body>
<div id="content"></div>

<script type="text/javascript">
    load_content();
</script>

</body>
</html>

正如你所看到的,我尝试了Triptych的解决方案......但仍然没有去。当请求仍然失败时,它会使用空白数据进行更新。既然我现在已经完成了所有事情,那么任何人都可以看到我正在犯的错误。

注意:忽略像%doc_path%这样的字符串...这些只是我使用的控制字符串,以便以后可以用编程方式替换每个文档的正确路径......所有在服务器上完成的东西都没有对此很重要。


@Vinze

根据文档,onFailure是“当请求完成且其状态代码存在但不在2xy系列中时调用。如果定义了特定于代码的回调,则会跳过此选项,并在onComplete之前发生。”

但是如果服务器停止了,它不会只是超时并且根本没有状态代码吗?也许我理解错了......

4 个答案:

答案 0 :(得分:1)

您可以在选项列表中添加onFailure选项,因为Ajax.PeriodicalUpdater继承了Ajax.Request(http://www.prototypejs.org/api/ajax/request)的属性

相反,您可能对使用“onComplete”或下面链接中的“请求生命周期”更感兴趣

答案 1 :(得分:1)

将对象(不是字符串)作为第一个参数传递给PeriodicalUpdater。键入为“成功”的值只会在成功的AJAX调用时调用。

new Ajax.PeriodicalUpdater({success: 'content'}, '/Doc?'+d.getTime(),
  {
    method: 'post',
    frequency: 5,
  });

More on Ajax.Updater(PeriodicalUpdater继承)

答案 2 :(得分:0)

如何自己做这一切?

从一个将调用更新的函数开始:

function requestMoreInfo(){
new Ajax.Request('url',
  {
    method:'get',
    parameters:  "someget=here",
    onSuccess: handleTheReturn
  });

}

然后创建一个处理服务器答案的函数:

function handleTheReturn(reply){
    var newMessages = eval('(' + reply.responseText + ')');
    //update your element or whatever
} 

然后每隔20(或其他)秒运行它:

new PeriodicalExecuter(requestMoreInfo, 20);

然后只需将第一个requestMoreInfo添加到你的onload函数中就可以了...现在解决你的问题,只需在handleTheReturn函数中验证newMessages var,你就可以做任何你想做的事情(让服务器发送一个JSON)要知道的对象是好的,或者其他一些代码可能,或者搜索您想要避免的特定错误!

答案 3 :(得分:0)

关于此的更多细节。

Ajax.PeriodicalUpdater not 继承Ajax.Updater,如http://www.prototypejs.org/api/ajax/periodicalupdater所述:

  

Ajax.PeriodicalUpdater不是Ajax.Updater的特化,尽管它的名字。

它确实将可选参数转发给Ajax.Updater(它本身是一个继承自Ajax.Request的类),这似乎意味着它等同于实例化Ajax.Request并将回调传递给它。

我已经测试过并且可以确认在这种情况下添加onFailure函数。也没有添加onException。

可以预期两者都可以工作,因为它们被传递给Ajax.PeriodicalUpdater实例化的Ajax.Updater对象。但是,经过一些调试后,似乎Ajax.Updater从未将不可用的服务器视为异常或失败。也就是说,成功的容器总是更新(在这种情况下,清空,在这种情况下),即使定义为{success:'content',failure:'failureContent'}。

另外,根据我的测试,当服务器没有响应时,Ajax.Updater(和Ajax.PeriodicalUpdater)既不调用onSuccess()也不调用onComplete()。

事实上,我设法获得的唯一回调是on0,如下所示:

new Ajax.PeriodicalUpdater('content', 'url', {
    frequency: 5,
    on0: function(requester, exception) {
        alert("ERROR 0");
    }
});

当服务器无法访问时,似乎0是Ajax.Request(Ajax.Updater的父类)的错误代码。

然而,坏消息是on0()在内容更新/清空之前被称为 ,这意味着无法用自定义内容替换该内容。

据我所知,在服务器无法访问的情况下,内容更新后根本不会调用可选的回调。

对于Ajax.PeriodicalUpdater和Ajax.Updater都是如此。这意味着我看到获得所需行为的唯一方法是直接使用Ajax.Request。