Promises

Like using Q

Promise Constructor

  1. var promise = new Promise(function(resolve, reject) {
  2. // do a thing, possibly async, then...
  3. if (/* everything turned out fine */) {
  4. resolve("Stuff worked!");
  5. } else {
  6. reject(Error("It broke"));
  7. }
  8. });
  9. return promise;

Promise Instance

A promise can be in 1 of 4 states

state meaning
fulfilled successfully resolved (1)
rejected rejected (2)
pending hasn’t resolved or rejected yet (undefined)
settled fulfilled or rejected (1 or 2)

Catch

You can use .catch instead of second handler in .then

  1. get('users.all')
  2. .then(function(users) {
  3. myController.users = users;
  4. })
  5. .catch(function() {
  6. delete myController.users;
  7. });

All

  1. var usersPromise = get('users.all');
  2. var postsPromise = get('ports.everyone');
  3. // Wait until BOTH are settled
  4. Promise.all([usersPromise, postsPromise])
  5. .then(function(results) {
  6. myController.users = results[0];
  7. myController.posts = results[1];
  8. }, function() {
  9. delete myController.users;
  10. delete myController.posts;
  11. });

Static Promise Methods

Method function
Promise.all(iterable) Wait until all settle
Promise.race(iterable) Wait until 1 settles
Promise.reject(reason) Create a promise that is already rejected
Promise.resolve(value) Create a promise that is already resolved

Use case: Promise to make an HTTP call

  1. function createRabbit(url, name, isActive = true) {
  2. return new Promise((resolve, reject) => {
  3. if (!name) {
  4. log.error('ERROR createRabbit name missing');
  5. reject(new Error('Name missing'));
  6. return this;
  7. }
  8. request
  9. .post(url)
  10. .send({ name, isActive})
  11. .set('Accept', 'application/json')
  12. .set('User-Agent', USER_AGENT)
  13. .end((err, result) => {
  14. if (err) {
  15. reject(err);
  16. return;
  17. }
  18. const {rabbitId} = result.body;
  19. if (rabbitId) {
  20. log.info('createRabbit success', {rabbitId});
  21. resolve(rabbitId);
  22. } else {
  23. log.info('FAILED createRabbit', {body: result.body});
  24. reject(new Error('Unable to create rabbit.'));
  25. }
  26. });
  27. });
  28. }