[AJAX] Réponse bloquée à undefined en mode asynchrone
Bonjour,
Je n'arrive pas à me dépatouiller de ce problème :
- j'utilise ajax pour vérifier si un fichier a été téléchargé en appelant une page php.
- les requêtes fonctionnent bien et renvoient : 'En cours' si le fichier n'est pas encore uploadé, 'Fichier téléchargé avec succès' en cas de réussite, et un message d'erreur en cas de problème.
- La console Firebug montre que la requête me renvoie bien 'Fichier téléchargé avec succès', que ce soit en mode synchrone ou asynchrone.
- En mode synchrone, mon script fonctionne, mais en mode asynchrone, ma variable 'step_response' sensée recevoir cette réponse reste bloquée en undefined.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| // Timer de récupération de la réponse à l'upload du fichier
timer_upload = setInterval(
function () {
if (step == 2) {
switch (step_response) {
case undefined:
break;
case 'En cours' :
alert('en cours');
step_response = ajax(
'GET',
'index.php',
'action=admin:import:upload_status',
false
);
break;
case 'Fichier téléchargé avec succès' :
alert('téléchargé');
// insertion dans table import
step_next = true ;
// Arrêt du timer_upload
clearInterval(timer_upload);
break;
default :
// erreur
step = 0;
// Arrêt du timer_upload
clearInterval(timer_upload);
break;
}
}
},
500
); |
Voici mon script pour AJAX :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| // XHR.js
//==============================================================================
function getXHR () {
var xhr = null;
// IE 7 et supérieur, autres navigateurs
if (window.XMLHttpRequest) xhr = new XMLHttpRequest();
// IE 6 et inférieur
else if (window.ActiveXObject) {
try { xhr = new ActiveXObject("Msxml2.XMLHTTP") }
catch (exception1) {
try { xhr = new ActiveXObject("Microsoft.XMLHTTP") }
catch (exception2) {}
}
}
// Erreur ou navigateur non pris en charge
if (xhr == null)
alert ("Une erreur s'est produite : "+
"AJAX n'est peut-être pas pris en charge par votre navigateur");
// Renvoi de l'objet
return xhr;
}
//==============================================================================
/*
Fontion ajax() :
- Instancie un objet XMLHttpRequest
- Envoie une requete GET ou POST
- Retourne XMLHttpRequest.responseText
Arguments :
- method : 'GET' ou 'POST'
- url : URL du fichier à appeler
- param : paramètres éventuels
- async : TRUE par défaut, pour mode asynchrone
- content_type : 'application/x-www-form-urlencoded' par défaut, 'data' ou
'multipart/form-data' à préciser pour l'envoi de données non ASCII, binaires
ou de grandes tailles
*/
function ajax(
method, url, param = null,
async = true,
content_type = "application/x-www-form-urlencoded") {
// Objet XMLHttpRequest
var xhr = getXHR();
// Configuration selon méthode GET ou POST
if (method.toUpperCase() == "GET") {
// GET
if (param != null) url = url + "?" + param;
xhr.open('GET',url,async); // 'true' pour mode asynchrone
}
else {
// POST
xhr.open('POST',url,async); // 'true' pour mode asynchrone
if (content_type == 'data') {
content_type = 'multipart/form-data';
}
xhr.setRequestHeader("Content-Type",content_type);
}
// Envoi
xhr.send(param);
// Réception
if (async) {
xhr.onReadyStateChange = function () {
if ( readyState == 4) {
return get_responseText(xhr);
}
}
}
else {
return get_responseText(xhr);
}
}
//==============================================================================
function get_responseText(xhr) {
if (xhr.status == 200) return xhr.responseText;
else return 'Erreur';
} |
Merci d'avance pour votre aide !