2013-10-14 2 views
0

J'appelle la fonction post http comme celui-ci:

$http.post(myUrl, myData, { timeout: 2000 }).success() etc 

L'appel fonctionne parfaitement lorsque la réponse est rapide, mais si la réponse prend plus de 2 secondes le code angularjs se bloque!

J'ai créé une seule page HTML qui fonctionne sur IE10, Chrome et Firefox, et montre clairement l'erreur sur IE9: http://www.apxproto.com/api/ngPost.htm (voir ce lieu du plunker ci-dessous)

J'ai vérifié angulaire code et quand il y a un délai, il appelle xhr.abort(). Le xhr.onreadystatechange tente d'obtenir des en-têtes en appelant xhr.getAllResponseHeaders(); C'est où si échoue parce que le xhr a été avorté.

Voici un plunker: http://plnkr.co/12rp7WqmDpPJC5ASazkJ

Notez que je ne l'ai été témoin de ce comportement sur IE9. (Malheureusement, plunker a aussi un problème avec IE9.)

Des suggestions? Tous les développeurs AngularJs Core là-bas? Merci

+0

Quelle version d'angulaire utilisez-vous? C'était un problème connu dans les versions précédentes. Selon cette page https://github.com/angular/angular.js/issues/1472 il est corrigé dans 1.2.0 – Ronnie

+0

J'utilise la version 1.0.8. Je pense que votre lien fait référence à un problème différent. Merci. – Bonneville

Répondre

0

Vous pouvez essayer une méthode de raccourci et de réduire le délai d'attente et voir si cela fait une différence

$http.post(url, myData, {timeout: 5000}); 

De plus, vous manquez un point-virgule à la fin de cette ligne

$log.info('Calling Url: ' + url + '. Timeout: ' + timeout) 

Corrigez cela et réessayez

+0

Cela ne fait aucune différence que la méthode de raccourci soit utilisée. Essayez ce http://www.apxproto.com/api/ngPost.htm sur IE9 et vous verrez l'erreur. Sur d'autres navigateurs modernes, ça marche! – Bonneville

+0

quelle que soit la raison pour laquelle vous utilisez timeout au lieu de q (différé)? –

+0

J'utilise un timeout car il fait partie de l'API ET parce que je veux annuler la requête si cela prend trop de temps. Ce n'est pas la même chose que de simplement reporter l'action sur une opération asynchrone. Quelque chose doit résoudre ou rejeter; donc j'ai besoin d'un délai d'attente. En outre, il semble y avoir quelque chose de fondamentalement faux dans le code angularJs car il appelle xhr.getAllResponseHeaders() sur un xhr qui a été abandonné! c'est-à-dire qu'il ne peut y avoir d'en-têtes! – Bonneville

Questions connexes