You can make use of closures to do this, without the need for any extra objects or wrapping.
var promise = firstQuery.get(objectId).then(function(result1){
return secondQuery.find()
.then(function(result2) {
return thirdQuery.find()
.then(function(result3) {
//can use result1, result2, result3 here
});
});
});
This "nested" syntax is identical in function to your "chaining" syntax.
EDIT based on comments
If your promise chain is long and complex enough that this nested syntax becomes ungainly, the logic is probably complex enough to merit abstraction into its own function.
function complexQuery(objectId) {
var results = {};
return firstQuery.get(objectId).then(function(result1) {
results.result1 = result1;
return secondQuery.find();
})
.then(function(result2) {
results.result2 = result2;
return thirdQuery.find();
})
.then(function(result3) {
results.result3 = result3;
return results;
});
}
complexQuery(objectId)
.then(function (results) {
//can use results.result1, results.result2, results.result3
});
Personally, I think that's easier to read and maintain than messing around with .bind
.