Skip to content

Instantly share code, notes, and snippets.

@jblashill
Last active January 3, 2016 08:29
Show Gist options
  • Save jblashill/8436882 to your computer and use it in GitHub Desktop.
Save jblashill/8436882 to your computer and use it in GitHub Desktop.
A function to easily adapt mongoose models to a ES6 Promises interface (using polyfill: https://github.com/jakearchibald/ES6-Promises)
var Promise = require('es6-promise').Promise;
var promisify = function (obj, func) {
return function () {
var args = Array.prototype.slice.call(arguments, 0);
return new Promise(function (resolve, reject) {
args.push(function (err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
func.apply(obj, args);
});
};
};
// create a rejected promise with a particular error (I feel like there must be a better way to do this)
var rejected = function(error) {
return new Promise(function(resolve, reject) {
reject(error);
});
};
// Example usage: (UserModel is a mongoose model)
var createUser = promisify(UserModel, UserModel.create);
createUser({ name: "James" })
.then(function(newuser) {
console.log("Success!");
}, function(err) {
// doh
console.log(err);
});
// Slightly more complex example:
var findUser = promisify(UserModel, UserModel.findOne);
var createUser = promisify(UserModel, UserModel.create);
var user = { name:"James" };
findUser(user)
.then(function(existing) {
if (existing) {
return rejected(new Error("User already exists!"));
} else {
return createUser(user);
}
})
.then(function(newuser) {
console.log("Success!");
})
.catch(function(err) {
// an error occurred (that is, promise was rejected) either finding or creating user
console.log(err);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment