Цепочка обещаний: использовать результат предыдущего обещания в следующем, затем обратном вызове [дубликат]

На этот вопрос уже есть ответ здесь:

Как получить доступ к предыдущим результатам обещания в цепочке .then ()? 15 ответов

Я использую прямые обещания ES6 (с библиотекой полифилов es6-обещания) и сталкиваюсь с проблемой доступа к результатам предыдущих обещаний в цепочках.

Эта проблема идентична в контексте Angular / Q, но я не удовлетворен ответом и хотел посмотреть, есть ли лучший способ:

Как получить доступ к результату предыдущего обещания в цепочке обещаний AngularJS?

Рассмотрим фрагмент кода ниже:

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

В обещании я хочу использоватьstudent объект, который я получил в первом обещании. Но, как написано, это не может получить к нему доступ. У меня есть пара очевидных вариантов:

сохранить ученика в переменной во внешней области видимости

Я на самом деле не знаю, как это будет работать, но решения в другом вопросе предполагают, что я могу позвонитьthen на результатHelpRequest.findByStudent() а такжеPromise.resolve объединенный результат внутриStudent.find().then вызов. Тем не менее, приведенная ниже реализация не сработает.

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

Я абсолютно не хочу заниматься обработкойhelpRequest вложенный внутриStudent.find() метод, который побеждает цель объединения Обещаний; и даже если второй пример можно перевести в пригодное для использования состояние, он все равно выглядит как хак.

Есть ли лучший способ добиться этого без необходимости введения глобального состояния или вложенности в мой код? Например, есть ли способ позвонитьPromise.resolve() на несколько значений, некоторые из которых могут быть обещаниями, а некоторые нет?

Мне любопытно, надеюсь, у меня есть альтернативы / я могу понять, как заставить это работать должным образом, не вводя вложенность или состояние!

Ответы на вопрос(1)

Ваш ответ на вопрос