programming
              
                JavaScript
              
            Oct 27, 2015
          
 JavaScript Promises
I read Best Practices for Using Promises in JS (opens new window). Here are some concise notes expanding on this topic.
- Let's use bluebird as Promise implementation for node
 - Use 
.then().catch()instead of.then(successCb, failCb) 
const promise = (shouldResolve) => new Promise((resolve, reject) => {
  if (shouldResolve) {
    resolve();
  } else {
    reject();
  }});
promise(arg)
  .then(() => { /* success */ })
  .catch(ExceptionToCatch, OtherExceptionToCatch, (err) => { /* error */})
  .catch(StrangeExceptionToCatch, (err) => { /* error */})
  .catch((err) => { /* error */}); // default
 1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
To define an exception to catch:
function MyCustomError() {}
MyCustomError.prototype = Object.create(Error.prototype);
promise(arg)
  .then(() => { throw new MyCustomError() })
  .catch(MyCustomError, (err) => {})
  .catch((err) => {});
 1
2
3
4
5
6
7
2
3
4
5
6
7
Promise.all([promiseA(a), promiseB(b)])runs two async functions in parallel, but.then(() => {})callback has no data result argument- Use 
.spreadinstead of.thento get this data:.spread((dataA, dataB) => {}) - To limit concurrency, 
Promise.map([lotsOfStuff], promise, { concurrency: 3 }).then(() => {}) - See also 
.reduceand.filter - You can "pipe" your 
.thenfunctions. If you do this, you should probably avoid using anonymous functions and enjoy more reusability, modularity, testability, readability 
readFile(data)
  .then(JSON.parse)
  .then(treatStuff)
  .catch(handleError)
 1
2
3
4
2
3
4
- Don't abuse this thing. It's nice to read, but it breaks the event loop and could introduce race conditions
 - A better approach is to pipe inside the 
.then: 
readFile(data)
  .then(pipe(JSON.parse, treatStuff))
  .catch(handleError)
 1
2
3
2
3
Further reading:
- http://bluebirdjs.com
 - https://promise-nuggets.github.io
 - http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
 - https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch3.md