Цепочка обещаний: использовать результат предыдущего обещания в следующем, затем обратном вызове [дубликат]
На этот вопрос уже есть ответ здесь:
Как получить доступ к предыдущим результатам обещания в цепочке .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()
на несколько значений, некоторые из которых могут быть обещаниями, а некоторые нет?
Мне любопытно, надеюсь, у меня есть альтернативы / я могу понять, как заставить это работать должным образом, не вводя вложенность или состояние!