tablas - ¿Cómo manejar javascript xmlhttprequests simultáneo?
xmlhttprequest javascript ejemplo (2)
Posible duplicado:
pasar el índice de la función de devolución de llamada for loop a ajax (javascript)
He estado un poco confundido con hacer xmlhttprequests, a diferentes servidores, para buscar algún contenido ... esto es lo que he escrito, pero parece que estoy equivocado en algún momento ...
var URL = new Array();
URL[0] = "http://www.example1.com";
URL[1] = "http://www.example2.com";
URL[2] = "http://www.example3.com";
var nRequest = new Array();
for (var i=0; i<3; i++){
nRequest[i] = new XMLHttpRequest();
nRequest[i].open("GET", URL[i], true);
nRequest[i].onreadystatechange = function (oEvent) {
if (nRequest[i].readyState === 4) {
if (nRequest[i].status === 200) {
console.log(nRequest[i].responseText);
alert(nRequest[i].responseText);
} else {
console.log("Error", nRequest[i].statusText);
}
}
};
nRequest[i].send(null);
}
con este código en IE10 me da acceso denegado en la consola ..
si elimino una matriz y uso una solicitud simple, funciona como se espera ..
wRequest = new XMLHttpRequest();
wRequest.open("GET", "http://www.example1.com", true);
wRequest.onreadystatechange = function (oEvent) {
if (wRequest.readyState === 4) {
if (wRequest.status === 200) {
console.log(wRequest.responseText);
alert(wRequest.responseText);
} else {
console.log("Error", wRequest.statusText);
}
}
};
wRequest.send(null);
}
pero ¿cómo se supone que debe desencadenar múltiples solicitudes de 2-3 y aún no tiene problemas con el manejo de datos?
haciendo xmlhttprequests, a diferentes servidores
Usted no puede hacer eso. XMLHttpRequest solo se puede conectar al mismo dominio al que pertenece la página. Esto se llama la "misma política de origen" .
Google "la misma política de origen" o búsquela aquí en SO para obtener más información.
El problema (ignorando el problema de dominios cruzados que slebetman cubrió) es que cuando se activa su devolución de llamada de cambio de estado listo, está utilizando la variable i
del alcance que contiene, que será 3
después de que se complete el bucle. Una forma de solucionarlo es la siguiente:
for (var i=0; i<3; i++){
(function(i) {
nRequest[i] = new XMLHttpRequest();
nRequest[i].open("GET", URL[i], true);
nRequest[i].onreadystatechange = function (oEvent) {
if (nRequest[i].readyState === 4) {
if (nRequest[i].status === 200) {
console.log(nRequest[i].responseText);
alert(nRequest[i].responseText);
} else {
console.log("Error", nRequest[i].statusText);
}
}
};
nRequest[i].send(null);
})(i);
}
Esto introduce una expresión de función invocada inmediatamente para cada iteración de bucle de modo que el código dentro de la función tenga su propia i
- la magia de cierres JS significa que cuando se onreadystatechange
función onreadystatechange
accederá al parámetro i
de la función anónima (aunque eso la función se ha completado), no la i
del alcance externo, por lo que el elemento nRequest
correcto se procesará cada vez.
También tienes un error tipográfico en la línea .open()
donde dijiste wURL[i]
pero debería haber tenido la URL[i]
.
Dependiendo de lo que planeas hacer con el texto de respuesta, no estoy seguro de que necesites una serie de solicitudes: podrías encapsular el código Ajax en una función que toma una URL y una función de devolución de llamada como parámetros, y luego llamar a esa funcionar en el ciclo ...