2012-06-25 14 views
9

Estoy usando JQuery $ .ajax para recorrer un conjunto de URL JSON y descargar resultados en una matriz. Algunas de las URL devuelven un 404, que estoy manejando & mostrando como un mensaje div.pasando variables a jQuery ajax éxito o funciones de error

Sin embargo, parece que no puedo pasar la URL, más precisamente siempre pasa la última URL en la matriz.

que suponer que se debe a que el Ajax es asíncrona y tarda más tiempo en completarse, pero no estoy seguro de qué otra manera para asegurarse de que sólo la corriente url JSON (o variable) está siendo mostrado en el éxito o el ERROR

Mi Código :

// For every URL loop through 'baseitems' array 
for (var i = 0; i < baseitems.length; i++) { 

    // This is where I'm hoping to store the current URL as a variable to pass to the end-user on Success or Error 
    var caturl = baseURL + "/" + baseitems[i]; 

    // Get the data via JSON 
    $.ajax({ 
    type: "GET", 
    url: caturl, 
    dataType: "json", 
    async: true, // set so that the variables caturl get updated below 
    success: function (result) { 
     // Success: store the object into catalog array 
     cat.unshift(result); 
     $('#showdata').prepend("Loaded: " + caturl + "</br>"); // still buggy here - probably async JSON issue 
    }, 
    error: function (xhr, textStatus, error) { 
     // Error: write out error 
     console.log(xhr.statusText); 
     console.log(textStatus); 
     console.log(error); 
     $('#showdata').prepend("ERROR : '" + error + "' trying to access: " + caturl + "</br>"); // still buggy here - probably async JSON issue 
    } 
}); 

}

** ACTUALIZACIÓN: CODIGO dE tRABAJO **

El código de trabajo completado con la ayuda @charlietfl + una cosa agradable pocos El código de éxito/error + número de URL cargadas está debajo. Gracias charlietfl & pacificador!

   $.ajax({ 
        type: "GET", 
        url: caturl, 
        dataType: "json", 
        async: true, // set so that the variables caturl get updated below 
        beforeSend: function (jqXHR, settings) { 
         /* add url property and get value from settings (or from caturl)*/ 
         jqXHR.url = settings.url; 
        }, 
        success: function (result, textStatus, jqXHR) { 
         // Success: store the object into catalog array 
         var url = jqXHR.url; 
         cat.unshift(result); 
         $('#showdata').prepend("<font size=\"1\">Loading: " + url + " status: " + textStatus + "</font></br>"); 
         successcount += 1; 

        }, 
        /* error to be deprecated in jQuery 1.8 , superseded by "fail" */ 
        error: function (jqXHR, textStatus, error) { 
         var url = jqXHR.url; 
         /* replace caturl with url in your append */ 
         $('#showdata').prepend("<font size=\"1\" color=\"red\">ERROR : '" + error + "' trying to access: " + url + "</font></br>"); 
        }, 
        complete: function (jqXHR, textStatus) { 
         $('#showdata').prepend("<font size=\"3\">Loaded <b>" + successcount + "</b> of " + baseitems.length + " total catalogs.</font></br>") 
        } 
       }); 
+0

¿Ha intentado pasar el valor de 'caturl' a la función en caturl en la llamada ajax, y luego simplemente devolviéndolo en el resultado? Alternativamente, como ya conoce la url en el servidor, la devuelve al 'resultado de éxito de ajax' y la usa allí – peacemaker

Respuesta

13

Aquí hay una manera. La opción de devolución de llamada beforeSend le da acceso tanto al objeto jqXHR como al objeto de configuración ajax.

No podrá usar caturl en el anexo de error, ya que no estará en sintonía con el error al lanzar la solicitud.

$.ajax({ 
    /* url, data ...& other opts*/ 
    beforeSend:function(jqXHR, settings){ 
     /* add url property and get value from settings (or from caturl)*/ 
     jqXHR.url= settings.url; 
    }, 
    /* error to be deprecated in jQuery 1.8 , superseded by "fail" */ 
    error: function(jqXHR, , textStatus, error){ 
     var url=jqXHR.url; 
    /* replace caturl with url in your append */ 
    $('#showdata').prepend("ERROR : '" + error + "' trying to access: " + url + "</br>"); 
    } 

EDIT: basado en 3er comentarios API partido, es importante recognze siguiente tomada directamente de $.ajax API

Cuando los datos se recuperan de los servidores remotos (que sólo es posible con la secuencia de comandos o tipos de datos jsonp), las devoluciones de llamadas de error y los eventos globales nunca se dispararán.

+0

Gracias por el código sugerido. Me apuntó en la dirección correcta, y con algunos pequeños retoques se resolvió. – NikG

+0

soy curioso ... son llamadas de dominio cruzado ... ¿pero estás obteniendo errores disparando? – charlietfl

+0

Sí, los errores se disparan bien; sin embargo, estoy ejecutando el código localmente en este momento. Tenga en cuenta que no está utilizando JSONP (sin función de devolución de llamada), pero parece estar funcionando al menos localmente – NikG

0

me gustaría sugerir simplemente pasando la URL desde el servidor, en pseduo-PHP sería como:

function function_called_by_ajax() 
{ 
    //processing... 

    echo json_encode(array('urlString'=>$urlString)); 

} 

Ahora en su éxito ajax que sólo puede obtener la cadena, algo como este pseudo js:

success: function (result) { 
    var caturl = result.urlString; 
    // Success: store the object into catalog array 
    cat.unshift(result); 
    $('#showdata').prepend("Loaded: " + caturl + "</br>"); 
} 
+0

difícil de pasar la URL desde el servidor cuando ajax falla y OP quiere el error url – charlietfl

+0

No tengo control sobre el servidor y pasando URL desde el servidor. Estoy leyendo de una API JSON de un tercero. – NikG

Cuestiones relacionadas