Thenable is a function or an object which has a then
function, whereas a 'promise' is an object or function with a then method whose behavior conforms to this specification.
Hence all promises are thenables and all thenables are not promises.
We can resolve thenables like a promise as shown below:
1const aThenable = {2 then(onFulfilled, onRejected) {3 onFulfilled(100)4 },5}6aThenable.then(result => console.log("Resolved value:", result))
We can also use thenables with await
syntax:
1const aThenable = {2 then(onFulfilled, onRejected) {3 onFulfilled(100)4 },5}6const result = await aThenable7console.log("Resolved value:", result)
Real-world example of thenables are mongoose queries. You can read more about how mongoose queries are not promises in the official documentation
We can convert a thenable to a Promise using the following code:
1const aThenable = {2 then(onFulfilled, onRejected) {3 onFulfilled(100)4 },5}6const p1 = Promise.resolve(aThenable)7p1 instanceof Promise // true
Do follow me on twitter where I post developer insights more often!