Encadenamiento de la promesa: utilice el resultado de la promesa anterior en la siguiente y luego en la devolución de llamada [duplicar]

Esta pregunta ya tiene una respuesta aquí:

¿Cómo accedo a resultados de promesas anteriores en una cadena .then ()? 15 respuestas

Estoy usando Promesas ES6 rectas (con la biblioteca polyfill es6-promise) y me encuentro con un problema para acceder a los resultados de las promesas anteriores en las encadenadas.

Este problema es idéntico en el contexto de Angular / Q, pero no estoy satisfecho con la respuesta y quería ver si hay una mejor manera:

¿Cómo acceder al resultado de la promesa anterior en la cadena de promesa AngularJS?

Considere el fragmento de código a continuación:

Student.find().then(function(student) {
        return HelpRequest.findByStudent(student);
    }, function(error) { //... }
).then(function(helpRequest) {
    // do things with helpRequest...
    // PROBLEM: I still want access to student. How can I get access to it?
});

En la promesa encadenada, quiero usar elstudent objeto que obtuve en la primera promesa. Pero como está escrito, esto no puede acceder. Tengo un par de opciones aparentes:

almacenar al alumno en una variable en un ámbito externo (yuck)

En realidad no sé cómo funcionaría esto, pero las soluciones en la otra pregunta sugieren que puedo llamarthen en el resultado deHelpRequest.findByStudent() yPromise.resolve el resultado combinado dentro delStudent.find().then llamada. Sin embargo, creo que la implementación a continuación no funcionará.

Student.find().then(function(student) {
        var data = {student: student};
        HelpRequest.findByStudent(student).then(function(helpRequest) {
            data.helpRequest = helpRequest;
        });
        // PROBLEM: if HelpRequest.findByStudent(student) is asynchronous, how 
        // does this get the data before returning?
        return data; 
    }, function(error) { //... }
).then(function(helpRequest) {
    // do things with helpRequest and student
});

Absolutamente no quiero hacer el procesamiento de lahelpRequest anidado dentro de laStudent.find() método, ya que eso derrota el propósito de encadenar Promesas; e incluso si el segundo ejemplo se puede trabajar en un estado utilizable, todavía se siente como un truco.

¿Hay una mejor manera de lograr esto sin tener que introducir el estado global o anidar en mi código? Por ejemplo, ¿hay alguna manera de llamarPromise.resolve() en valores múltiples, algunos de los cuales pueden ser promesas y otros no.

Tengo curiosidad, ¡espero tener alternativas / puedo entender cómo hacer que esto funcione correctamente sin introducir el anidamiento o el estado!

Respuestas a la pregunta(1)

Su respuesta a la pregunta