2011-07-11 15 views
6

Estoy tratando de implementar el siguiente escenario, utilizando JQuery diferido, sin mucha suerte.jQuery diferido - ¿Necesito tuberías o cadenas para lograr este patrón?

¿Qué partes de la API diferida habría que utilizar, y cómo habría que estructurar sus llamadas para lograr lo siguiente:

primera ajax calla a serviceâ recuperar una lista de ID

esperar hasta esta llamada devuelve

entonces n llamadas Ajax a serviceB, cada llamada mediante un utilizando un ID de la lista devuelta por CALLA

esperar hasta haber regresado todas las llamadas serviceB

entonces una llamada ajax final a servicec

Respuesta

12

Se podría hacer como esto (pseudocódigo más o menos):

(function() { 
    // new scope 
    var data = []; // the ids coming back from serviceA 

    var deferredA = callToServiceA(data); // has to add the ids to data 

    deferredA.done(function() { // if callToServiceA successful... 
     var deferredBs = []; 

     for i in data { 
      deferredBs.push(callToServiceB(...)); 
     } 

     $.when.apply($, deferredBs).then(callToServiceC); 
    }); 

}()); 

callToServiceX La función debe devolver el objeto devuelto por la promesa $.ajax.

Puede haber una solución "limpia" que tenga data en un alcance compartido, con resolve, pero la configuración sería un poco más difícil (y no necesariamente más legible).

+1

Gracias que funcionó. Aquí hay un jsFiddle que implementa el diseño: http://jsfiddle.net/zdam/kWP36/ – zadam

+0

@zadam: Buen ejemplo :) ¡Me alegra que haya funcionado! –

Cuestiones relacionadas