Last active
January 3, 2016 08:29
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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