2011-01-27 2 views
0

Je fais un appel ajax comme ceci:jquery ajax requête ayant échoué ne peut pas déclencher gestionnaire complet ou une erreur

var requestData = function() { 
    $.ajax({ 
     dataType: 'jsonp', 
     jsonp: 'js', 
     url: "http://someServer", 
     success: function (data) { 
      // do stuff with data 
     }, 
     complete : function(data) { 
      // try again in 5 seconds 
      setTimeout(requestData, 5000); 
     } 
    }); 
}; 

Tout est bien et bon, et cela fonctionne, SAUF: le serveur est un peu squameuse, et de temps en temps, il ne parvient pas à retourner une réponse. C'est bien, mais quand cela arrive, le gestionnaire complet ne se déclenche jamais. J'ai également essayé d'utiliser un gestionnaire d'erreur. Y a-t-il autre chose que je puisse faire? J'ai réfléchi à l'utilisation de setInterval, mais je préférerais qu'il fasse le suivant après celui-ci, pas à un moment donné où il pourrait s'accumuler ...

MISE À JOUR: lorsque le serveur tombe en panne, je reçois "Impossible de charger la ressource" dans la console de chrome.

Répondre

0

Le problème est que JSONP fonctionne en insérant une balise script dans le DOM, plutôt que par XMLHTTPRequest. Les balises script n'ont pas de propriété onerror, vous ne pouvez donc pas tester le succès par des méthodes conventionnelles. La seule façon de le faire est via un timeout.

Quelque chose comme cela pourrait fonctionner:

var requestComplete = {}; 
var requestData = function() { 
    var now = (new Date()).getTime(); 
    requestComplete[now] = false; 
    $.ajax({ 
     dataType: 'jsonp', 
     jsonp: 'js', 
     url: "http://someServer", 
     success: function (data) { 
      requestComplete[now] = true; 
      // do stuff with data 
     } 
    }); 
    setTimeout(function() { 
     if (!requestComplete[now]) { 
      setTimeout(requestData, 5000); // try again in 5 seconds 
     } 
    }, 5000); // give the JSONP request 5 seconds to work 
}; 
+0

ok. setInterval fonctionne bien, donc je suppose que je vais vivre avec ça. Merci. – sprugman

Questions connexes