Emparejamiento de datos de múltiples llamadas de AJAX diferidos con su persona que llama

StackOverflow https://stackoverflow.com/questions/8837260

  •  27-10-2019
  •  | 
  •  

Pregunta

Estoy trabajando con múltiples llamadas AJAX diferidas y me gustaría ser dinámico sobre cómo accedo a sus datos. En lugar de codificar en varios parámetros en la devolución de llamada. Luego, usando cada uno individualmente, me gustaría recorrer el objeto de argumentos para acceder a los datos. Esto funciona bien, excepto que no puedo determinar a partir del JSON de qué datos son de los cuales AJAX LLAME. Podría resolver esto, ya sea determinando la URL del objeto de promesa (de alguna manera) o descubriendo qué orden se ejecutaron las llamadas de AJAX y suponiendo que los datos estén en el mismo orden.

Aquí está mi código hasta ahora (burlado para ilustrar lo que estoy tratando de hacer):

promises = [ 
    $.get("example.php", {}, function(){}),
    $.get("list.php", {}, function(){}),
    $.get("test.php", {}, function(){}),

]

$.when.apply(null, promises).then( function() {
     jsonarray = []
     $.each(arguments, function(index, value){
         // this is what I would like to work but doesn't
         // promises[index].success.url is how I imagine accessing 
         //"list.php" or "test.php"
         if (jsonarray[promises[index].success.url] == null){
              jsonarray[promises[index].success.url] = []
         }
         jsonarray[promises[index].success.url] = value
         doSomethingWith(jsonarray)
     })

¿Hay otra forma de igualar cada argumento con la llamada Ajax que lo produjo? Lo que no quiero hacer es esto:

$.when.apply(null, promises).then( function(examplejson, listjson, testjson) {
         // this is lame
         exampledoSomethingWith(examplejson)
         listdoSomethingWith(listjson)
         testdoSomethingWith(testjson)
})

¡Gracias! Sara

¿Fue útil?

Solución

http://jsfiddle.net/6ezsh/2/

$(function() {

    var objs = [{'one':1},{'two':2},{'three':3}];
    var urls = [];

    ajaxCall = function(i) {
        return $.ajax({
            url:'/echo/html/',
            method: 'POST',
            data: {id:i}
        }).done(function () {
            urls.push({obj:i,url:this.url});
        });   
    }

   $.when.apply($,
        objs.map(function(i) {
            return ajaxCall(i);
        })
    ).then(
        console.log(urls)
    );

});

Como se mencionó, el objeto que recibe en su "entonces" son los manejadores de éxito para todos sus diferencias. Entonces, la única forma real de emparejar esta información sería en el controlador de éxito de sus llamadas AJAX. Ejemplo arriba.

Otros consejos

intentemos

var urls = [
    "example.php",
    "list.php",
    "test.php"
];
var promises = [  
];

var jsonarray = {};
$.each(urls, function(index, value) {
    promises[index] = $.get(urls[index], {}, function(){});
    promises[index].success(function(data) {
        jsonarray[urls[index]] = data; //is this the value you want in the jsonarray??
    });
});

$.when.apply(null, promises).then( function() {
    doSomethingWith(jsonarray) 
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top