Usar Javascript / JQuery para acceder a una matriz construida a partir de un archivo XML externo

Espero que esta no sea una pregunta demasiado nueva, pero me he estado tirando de los pelos por un tiempo, así que pensé en ceder y pedir mi primer consejo aquí.

Estoy tratando de leer un archivo xml externo usando javascript / jQuery / ajax y colocar los datos recuperados en una matriz para poder hacer referencia a ellos más tarde.

Hasta ahora, parece que estoy haciendo todo bien hasta el punto en que puse los datos en la matriz, pero luego estoy luchando para leer los datos en cualquier otro lugar que no sea dentro de la función donde los creo. ¿Por qué no puedo acceder a la matriz desde cualquier otro lugar que no sea en esa función?

Aquí está mi código ... ¡¡Por favor ayuda !!

$.ajax({
    type: "GET",
    url: "data.xml",
    dataType: "xml",
    success: do_xmlParser
});

function do_xmlParser(xml)
{
    var myArray = new Array();

    $(xml).find("tag").each(function ()
    {
        myArray.push($(this).find("innerTag").text());
    });

    console.log("inside "+myArray); // This outputs the array I am expecting

    return myArray; // is this right???
}
console.log("outside: "+myArray); // This does NOT output the array but instead I get "myArray is not defined"

preguntado el 27 de agosto de 11 a las 23:08

2 Respuestas

Estas definiendo do_xmlParser como una devolución de llamada a una función asincrónica (success de la llamada jquery ajax). Todo lo que desee que suceda después de que la llamada ajax tenga éxito tiene que ocurrir dentro de esa función de devolución de llamada, o debe encadenar funciones desde la devolución de llamada exitosa.

De la forma en que lo tiene ahora, la ejecución real del código será:

ajax -> file being requested -> console.log -> 
        file transfer done -> success handler

Si estás haciendo cosas críticas y quieres la llamada sea síncrona, puede suministrar el
async : false
configuración de la llamada ajax. Entonces, debería poder hacer algo como esto:

var myArray = [],
do_xmlParser = function (xml)
{
    $(xml).find("tag").each(function ()
    {
        myArray.push($(this).find("innerTag").text());
    });
};

$.ajax({
    type: "GET",
    url: "data.xml",
    dataType: "xml",
    success: do_xmlParser,
    async: false
});

console.log("outside: " + myArray);

La async Sin embargo, la opción no funciona para solicitudes entre dominios.

NOTA
No recomiendo hacer esto. Se supone que las llamadas AJAX son asincrónicas, y siempre uso el success devolución de llamada para realizar todo el procesamiento de los datos devueltos.

Edit:

Además, si te gusta leer ... te recomiendo Referencia de jQuery Pocket y JavaScript: la guía definitiva (ambos de David Flanagan).

Respondido 28 ago 11, 17:08

¡¡Excelente!! ¡No puedo creer que un cambio tan pequeño haya solucionado este dolor de cabeza! Por cierto, (perdón por divagarme a un punto ligeramente diferente, pero) ¿cuáles son los riesgos de hacerlo de esta manera o es solo por preferencia personal que no lo hace? - Pato en natillas

Se supone que AJAX hace que todo sea asincrónico o no bloqueante. Al forzar que la solicitud sea sincrónica, todos los demás scripts de su página se bloquearán, es decir, no se ejecutarán hasta que se complete. Si tiene esto ejecutándose cuando el DOM está listo, incluso puede hacer que las imágenes esperen hasta que este código se complete antes de que terminen de cargarse. Si su archivo xml es enorme o tarda mucho en finalizar la transferencia, es posible que vea un error sobre una secuencia de comandos que no responde (según su navegador). Como mínimo, pondría este código más cerca del final de la devolución de llamada lista de su dom. - Jim Schubert

Gracias. Estoy cansado y me voy a la cama ahora, pero veré si no puedo reescribir el código mañana. Pato en natillas

Con eso en mente. ¿Tiene algún consejo sobre cómo podría escribir esto mejor? ¿O debería mantenerme alejado de la idea de 'xml en matriz' todos juntos? (¡lo que puede explicar por qué parece haber una falta total de tutoriales sobre ese método cuando se busca en Google!) - Pato en natillas

Como ejemplo, consulte la fuente de un rastreador de terremotos que escribí: github.com/jimschubert/quaketracker/blob/master/src/js/… Verá que todo lo que requiere los datos cargados desde xml se realiza mediante la devolución de llamada exitosa (por ejemplo, dentro de ese controlador, llamo addMarker). - Jim Schubert

mira de cerca y verás. En realidad, está activando una matriz que no existe. Ha declarado myArray dentro de la función. Intenta hacer algo como esto.

console.lod("outside :"+do_xmlParser(xml)); // I think that when you merge a string and an array it will output only string, but I can be wrong.

Respondido 28 ago 11, 03:08

Entonces, ¿dónde declaro la matriz para poder agregarla dentro de la función y luego leerla más tarde? - Pato en natillas

Realmente. Esto no puede ser correcto ya que dentro de la función obtengo la cadena seguida del contenido de la matriz. así: "Interior: 4, 5, 4, 3, 4, 5, 4, 4, 3", etc. - Pato en natillas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.