La forma correcta de iterar jQuery ajax y pasar argumentos

Quiero resolver de una vez por todas el problema de ponerle un bucle a la solicitud de Ajax y pasarle 'índice' (el problema a continuación):

for (var index = 0; index < 4; index++) {
    $.ajax({
        url: 'http://graph.facebook.com/',
        dataType: 'jsonp',
        success: function(json) {
            console.log(json[index]);
        }
    });
}

en este código dentro de cada 'éxito' el 'índice' de devolución de llamada será 3. Pero quiero invocar la devolución de llamada con 0, 1, 2, 3. Muchas personas están colocando una solicitud ajax dentro de un cierre:

for (var index = 0; index < 4; index++) {
    (function(index){$.ajax({
        url: 'http://graph.facebook.com/',
        dataType: 'jsonp',
        success: function(json) {
            console.log(json[index]);
        }
    });
    })(index);
}

lo que en mi opinión es un gran error, ¿qué pasa si la solicitud no estará allí en ese momento? La variable 'json' será 'indefinida'.

¿Alguno de ustedes tiene alguna forma adecuada de resolver este problema?

0
Porque está invocando de inmediato y no está esperando a que los datos respondan.
agregado el autor Oskar Szura, fuente
Tal vez cometí algún otro error que ... bueno, lo intentaré de nuevo. También leeré más sobre este deffering. Gracias a todos ustedes.
agregado el autor Oskar Szura, fuente
No entiendo por qué piensas que el cierre es una mala solución aquí.
agregado el autor thefourtheye, fuente
@OskarSzura Pero los datos vienen de forma asincrónica.
agregado el autor thefourtheye, fuente
Esto es lo que necesita api.jquery.com/category/deferred-object
agregado el autor elclanrs, fuente
@OskarSzura No creo que la variable json sea undefined , porque la función success en $. Ajax es una devolución de llamada y se ejecutará una vez que la solicitud AJAX tenga éxito, por lo que puede estar seguro de que json nunca está indefinido. Entonces creo que ir con el cierre es una buena idea.
agregado el autor Arnelle Balane, fuente

1 Respuestas

Actually the JSON will not be undefined.
If you would break the following code apart it would become more clear:
So instead of this:

for (var index = 0; index < 4; index++) {
    (function(index){$.ajax({
        url: 'http://graph.facebook.com/',
        dataType: 'jsonp',
        success: function(json) {
            console.log(json[index]);
        }
    });
    })(index);
}

... también puedes escribirlo así:

function myFunction(index) {
    $.ajax({
            url: 'http://graph.facebook.com/',
            dataType: 'jsonp',
            success: function(json) {
                console.log(json[index]);
            }
    });
}

// and call it like this

for (var index = 0; index < 4; index++) {
    myFunction(index);
}

As you might already see, how are any of those two variables going to change by another call while they are defined inside the function?

(On a side note: I think it actually looks cleaner this way)

0
agregado
JavaScript - Comunidad española
JavaScript - Comunidad española
4 de los participantes

En este grupo hablamos de JavaScript. Partner: es.switch-case.com