/ / ¿Cómo ejecutar una cadena de promesa y luego usando map o reducir en un número arbitrario de elementos de cadena? - javascript, asíncrono, mapreduce, promise, rsvp-promise

¿Cómo ejecutar una promesa, luego encadenar usando un mapa o reducir en un número arbitrario de elementos de la cadena? - javascript, asynchronous, mapreduce, promise, rsvp-promise

Estoy atrapado en lo siguiente:

Un script devuelve un número arbitrario. n o matriz, así:

[["a"], ["b"], ["c"], ["d"]]

Necesito recorrer los arreglos usando promesa then(), pero como no sé cuántos elementos habrá, terminé haciendo esto:

  var bundle_list = [["a"], ["b"], ["c"], ["d"]];

var x = bundle_list.reduce(function(current, next) {
console.log(current);

// requestBundle will also return a promise
return requestBundle(current)
.then(function(bundle_response) {
// do foo
console.log("CALLING NEXT")
console.log(next);
return RSVP.resolve(next);
});
})

x.then(function(last_response) {
return console.log("DONE")
});

Mi problema es que mi reduce/map ambos activan todas las iteraciones antes de que se ejecute mi código asíncrono, por lo que obtengo el triple de current consola seguida de la done consola. Así que todo mi "bucle" de mapas se ejecuta instantáneamente, con los resultados marcando un poco (demasiado) más tarde ...

Estoy usando esto RSVP implementación, pero es A +, así que no debería ser un problema. He estado tratando de trabajar junto con la respuesta proporcionada aquí, pero no puedo hacer que funcione correctamente.

Pregunta:
¿Es posible crear una "cadena de entonces" con un número arbitrario de then declaraciones. Si es así, ¡se agradecen algunos consejos!

¡Gracias!

Respuestas

8 para la respuesta № 1

Un bucle for (or forEach) debería hacer:

var queue = RSVP.Promise.resolve(); // in ES6 or BB, just Promise.resolve();

bundle_list.forEach(function(el){
queue = queue.then(function(res){
console.log("Calling async func for", el);
return requestBundle(el);
});
});

queue.then(function(lastResponse){
console.log("Done!");
});