Essayez / attrapez avec jquery demande ajax

J’essaie de créer une extension Google Chrome permettant d’effectuer une demande ajax. Quelque chose de semblable à l’extension GMail Checker. Le problème est que lorsque je fais la demande en utilisant jquery, et que je mets un nom d’utilisateur / mot de passe incorrect, cela échoue en silence, la fonction de rappel d’erreur étant ignorée.

Si je déplace l’appel ajax hors du script background.html (où je ne peux pas voir les demandes dans la fenêtre du développeur), vers le script options.html, une boîte de dialog se réauthentifie. Si je clique sur annuler, ALORS le rappel d’erreur jQuery se déclenche.

Mais dans l’extension de modèle d’origine (encore une fois, le vérificateur Gmail), ils utilisent des appels ajax simples (non-jquery) avec un essai / attrapé, et si je mets de fausses informations d’identification, je reçois une alerte le disant autant.

J’ai essayé d’emballer l’appel jQuery entier dans un try / catch, comme ceci:

try { $.ajax({ type: "POST", url: someurl, contentType : "text/xml", data: somedata, username: user, password: pass, success: function(data,status,xhr){ alert("Hurrah!"); }, error: function(xhr, status, error){ alert("Error!" + xhr.status); }, dataType: "xml" }); } catch(e) { alert("You messed something up!"); } 

Mais toujours rien.

L’erreur est-elle due au fait qu’elle est asynchrone ou Chrome ne renvoie-t-il pas la demande en tant qu’erreur, car il souhaite demander à nouveau des informations d’identification? Ou est-ce que je ne sais pas comment utiliser try / catch?

Mettre à jour

Voici une version très simplifiée de la manière dont le code de modèle effectue la requête:

 var req = new XMLHttpRequest(); req.onreadystatechange = function() { try { if ( req.readyState == 4 ) { //Do some stuff with results } } catch (ex) { alert('Error parsing response.'); } } try { req.send (data); } catch (ex) { alert ('Something went wrong with the request.'); } 

    Essayez quelque chose de plus semblable à ceci, où vous avez une fonction qui s’exécute sur chaque demande une fois complétée, indépendamment de ce qui se passe. Cela devrait résoudre le problème:

     // Store a global var so we can all play nicely. // Make sure this gets reset to false right before your AJAX call, // or it will only work once! var weHaveSuccess = false; $.ajax({ type: "POST", url: someurl, contentType : "text/xml", data: somedata, username: user, password: pass, success: function(data,status,xhr){ alert("Hurrah!"); weHaveSuccess = true; }, error: function(xhr, status, error){ alert("Error!" + xhr.status); }, complete: function(){ if(!weHaveSuccess){ alert('Your username/password seems to be incorrect!'); } }, dataType: "xml" }); 

    La fonction de rappel d’erreur ajax ne lève pas une exception seule. Si vous voulez essayer / attraper, vous devriez probablement jeter vous-même une exception dans votre fonction d’erreur. Cela déclenchera votre capture environnante.

    PS! Parfois, vous devez définir le paramètre async: false dans l’appel ajax lorsque vous devez évaluer le résultat car, par défaut, le code continuera après le lancement de la demande ajax et appellera de manière asynchrone le rappel de succès ou d’erreur ultérieurement et uniquement code.