Avoiding common mistakes
updated about 4 years ago
Promises don’t work like other values
You cannot print their value like most values:
// This doesn't make sense w/ promises: console.log(Promise.resolve(42)) // We must use the `.then` interface: Promise.resolve(42) .then(value => console.log(value))
Promises don’t warn you when making a mistake
Well, a likely mistake.
For a variety of reasons, it was decided by TC39 that
.catch may be passed null. For example,
.then(null, null) is valid and the required behavior is to skip that ‘step’ in the chain.
The unfortunate consequence of this is it’s very easy to screw things up.
Let’s look at a mini challenge: which of the following option(s) will
// Option #1: Promise.resolve(42) .then(console.log()) // Option #2: Promise.resolve(42) .then(console.log) // Option #3: Promise.resolve(42) .then(value => console.log(value)) // Option #4: Promise.resolve(42) .then(console.log()) .then(console.log)
The answer is #2, #3 & #4.
Why? Let’s look at the types of what was passed to
var arg1 = console.log() var arg2 = console.log var arg3 = value => console.log(value) typeof arg1 === "undefined" typeof arg2 === "function" typeof arg3 === "function"
Still wondering how that 4th Option works?
It’s effectively running like this:
// Option #4 - effectively Promise.resolve(42) .then(undefined) // this has no affect on the value, it will be handed to following `.then(fn)` .then(console.log)