2009-01-13 3 views
2

J'utilise ce qui suit pour saisir du code HTML mis à jour et l'insérer dans un div avec id « content »Prototype Ajax.PeriodicalUpdater insère une chaîne vide lorsque le serveur injoignable

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

Le problème est que lorsque le serveur est arrêter (il fonctionne à l'intérieur d'une application qui modifie et réapprovisionne les données), le programme de mise à jour efface simplement le contenu div.

Existe-t-il un moyen de faire en sorte que lorsque PeriodicalUpdater expire, obtienne un 404, etc., il laisse simplement le contenu inchangé? Je préférerais que les dernières données disponibles restent là, ne soient pas effacées.


Pour être complet, voici mon code entier:

<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> 

Comme vous pouvez le voir, j'ai essayé la solution de Triptyque ... mais toujours pas aller. Il met à jour avec des données vierges lorsque la demande échoue encore. Depuis que j'ai tout ici, tout le monde peut voir les erreurs que je fais. Remarque: Ignorez les chaînes comme% doc_path% ... ce ne sont que des chaînes de contrôle que j'utilise pour qu'elles puissent être remplacées par programme ultérieurement avec le bon chemin pour chaque document ... tout ce qui est fait sur le serveur et vraiment ça n'a pas d'importance pour ça.


@Vinze

Selon la documentation, onFailure est « Invoqué lorsqu'une demande complète et son code d'état existe mais pas dans la famille 2xy. Ceci est ignorée si on définit un rappel spécifique à code, et arrive avant onComplete. "

Mais si le serveur a été arrêté, est-ce que ce n'est pas le cas et qu'il n'y a pas de code d'état? Peut-être que je comprends que mal ...

+0

@Basic - ah. À l'avenir, juste un drapeau, vous n'avez pas besoin de modifier car nous avons un outil de mod pour faire des trucs intelligents comme ça. Mais merci quand même :) – Kev

Répondre

1

Transmettez un objet (pas une chaîne) en tant que premier paramètre à PeriodicalUpdater. La valeur définie comme "succès" ne sera appelée que sur les appels AJAX réussis.

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

More on Ajax.Updater (dont PeriodicalUpdater hérite)

1

vous pouvez ajouter une option onFailure dans la liste d'options que le Ajax.PeriodicalUpdater hérite des propriétés de Ajax.Request (http://www.prototypejs.org/api/ajax/request)

Dans le contraire, vous pouvez être plus intéressés par l'utilisation de "onComplete" ou l'un des "Cycle de vie de la demande" dans le lien ci-dessous

0

Que diriez-vous de faire tout cela par vous-même?

Commencez par une fonction qui appelle la mise à jour:

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

} 

Ensuite, créez une fonction qui va gérer la réponse du serveur:

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

Et puis exécutez toutes les 20 (ou quoi que) secondes avec:

new PeriodicalExecuter(requestMoreInfo, 20); 

Ensuite, il suffit d'ajouter un premier requestMoreInfo à votre onload functio n et votre bon pour y aller ... maintenant pour résoudre votre problème, il suffit de valider le newMessages var dans la fonction handleTheReturn et vous pouvez faire tout ce que vous voulez (faire que le serveur envoie un objet JSON savoir, ou d'autres codes peut-être, ou recherchez les erreurs spécifiques que vous voulez éviter!

+0

Down vote? dis moi pourquoi! – DFectuoso

+0

Incorrect, PeriodicalExecuter existe: http://www.prototypejs.org/api/periodicalExecuter – Vinze

+0

Même si vous avez raison quand vous dites que ce n'est probablement pas la meilleure façon de le faire ... – Vinze

0

Plus de détails sur ce sujet.

Ajax.PeriodicalUpdater ne pas Hériter de Ajax.Updater, comme expliqué à la http://www.prototypejs.org/api/ajax/periodicalupdater:

Ajax.PeriodicalUpdater n'est pas une spécialisation de Ajax.Updater, en dépit de son nom.

Il ne transmet les paramètres facultatifs se rapportant à Ajax.Updater (lui-même une classe qui hérite de Ajax.Request), ce qui ne semble impliquer qu'il est équivalent à l'instanciation d'un Ajax.Request et callbacks en lui passant.

J'ai testé et je peux confirmer que l'ajout d'une fonction onFailure pas fonctionne dans ce cas. Ajout de onException

Les deux auraient pu fonctionner normalement, puisqu'ils sont passés à l'objet Ajax.Updater instancié par Ajax.PeriodicalUpdater. Cependant, après un débogage, il semble que Ajax.Updater ne considère jamais un serveur indisponible comme une exception ou un échec. Autrement dit, le conteneur pour le succès est toujours mis à jour (bien, vidé, dans ce cas), même s'il est défini comme {success: 'content', failure: 'failureContent'}. En outre, selon mes tests, Ajax.Updater (et Ajax.PeriodicalUpdater) n'appelle ni onSuccess() ni onComplete() lorsque le serveur ne répond pas.

En fait, le seul rappel que je réussi à obtenir est on0, comme suit:

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

Il semble que 0 est le code d'erreur pour Ajax.Request (la classe parente pour Ajax.Updater) lorsque la le serveur n'est pas joignable. La mauvaise nouvelle, cependant, est que on0() s'appelle avant le contenu est mis à jour/vidé, ce qui signifie qu'il est impossible de remplacer ce contenu par un contenu personnalisé.

Autant que je sache, dans le cas d'un serveur inaccessible, aucun callback facultatif n'est appelé après la mise à jour du contenu.

Ceci est vrai pour Ajax.PeriodicalUpdater et Ajax.Updater. Ce qui signifie que la seule façon de voir le comportement voulu est d'utiliser Ajax.Request directement.

Questions connexes