I wouldn't wait for all promises (or all nextStuffPromises) before translating the results back to the objects:
Q.all(_.invoke(promises, "then", function(obj) {
// or:_.map(promises, function(p) { return p.then(function(obj) {
return obj.nextStuff().then(function(nextStuff) {
return {
prevStuff: obj,
nextStuff: nextStuff
};
}); // });
})).then(console.log.bind(console, "result:"));
There isn't any way in Q to access previous results other than by nesting then
calls.