Encadeamento de promessa: use o resultado da promessa anterior no próximo e depois o retorno de chamada [duplicado]

Esta pergunta já tem uma resposta aqui:

Como acesso os resultados das promessas anteriores em uma cadeia .then ()? 15 respostas

Estou usando as promessas ES6 diretas (com a biblioteca polyfill es6-promessa) e estou com um problema ao acessar resultados de promessas anteriores em cadeias.

Esse problema é idêntico no contexto do Angular / Q, mas estou insatisfeito com a resposta e queria ver se há uma maneira melhor:

Como acessar o resultado da promessa anterior na cadeia de promessas do AngularJS?

Considere o trecho de código abaixo:

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?
});

Na promessa encadeada, quero usar ostudent objeto que recebi na primeira promessa. Mas, como está escrito, isso não pode ser acessado. Eu tenho algumas opções aparentes:

armazenar o aluno em uma variável em um escopo externo (eca)

Na verdade, eu não sei como isso funcionaria, mas as soluções na outra pergunta sugerem que eu posso chamarthen no resultado deHelpRequest.findByStudent() ePromise.resolve o resultado combinado dentro doStudent.find().then ligar. A implementação abaixo não funcionará, eu acho.

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
});

Eu absolutamente não quero fazer o processamento dohelpRequest aninhado dentro doStudent.find() método, pois isso derrota o propósito de encadear promessas; e mesmo se o segundo exemplo puder ser trabalhado em um estado utilizável, ele ainda parecerá um hack.

Existe uma maneira melhor de conseguir isso sem ter que introduzir estado global ou aninhamento no meu código? Por exemplo, existe uma maneira de chamarPromise.resolve() em múltiplos valores, alguns dos quais podem ser promessas e outros não.

Estou curioso, espero ter alternativas / posso entender como fazer isso funcionar corretamente sem introduzir estado ou aninhamento!

questionAnswers(1)

yourAnswerToTheQuestion