I have restructured my code to promises, and built a wonderful long flat promise chain, consisting of multiple .then()
callbacks. In the end I want to return some composite value, and need to access multiple intermediate promise results. However the resolution values from the middle of the sequence are not in scope in the last callback, how do I access them?
function getExample() {
return promiseA(…).then(function(resultA) {
// Some processing
return promiseB(…);
}).then(function(resultB) {
// More processing
return // How do I gain access to resultA here?
});
}
Another answer, using sequential executor nsynjs:
Update: added working example
easy way :D
I think you can use hash of RSVP.
Something like as below :
Nesting (and) closures
Using closures for maintaining the scope of variables (in our case, the success callback function parameters) is the natural JavaScript solution. With promises, we can arbitrarily nest and flatten
.then()
callbacks - they are semantically equivalent, except for the scope of the inner one.Of course, this is building an indentation pyramid. If indentation is getting too large, you still can apply the old tools to counter the pyramid of doom: modularize, use extra named functions, and flatten the promise chain as soon as you don't need a variable any more.
In theory, you can always avoid more than two levels of nesting (by making all closures explicit), in practise use as many as are reasonable.
You can also use helper functions for this kind of partial application, like
_.partial
from Underscore/lodash or the native.bind()
method, to further decrease indentation:Mutable contextual state
The trivial (but inelegant and rather errorprone) solution is to just use higher-scope variables (to which all callbacks in the chain have access) and write result values to them when you get them:
Instead of many variables one might also use an (initially empty) object, on which the results are stored as dynamically created properties.
This solution has several drawbacks:
The Bluebird library encourages the use of an object that is passed along, using their
bind()
method to assign a context object to a promise chain. It will be accessible from each callback function via the otherwise unusablethis
keyword. While object properties are more prone to undetected typos than variables, the pattern is quite clever:This approach can be easily simulated in promise libraries that do not support .bind (although in a somewhat more verbose way and cannot be used in an expression):
Another answer, using
babel-node
version <6Using
async - await
npm install -g babel@5.6.14
example.js:
Then, run
babel-node example.js
and voila!