Imagine that we are developing a function isPi :
 function isPi(x) { return x === 3.14 } And then someone says: "We do not want to know where the data comes from (database, network, etc.), so let's wrap our code in Promise":
 function isPi(px) { return px.then(x => return x === 3.14 }) } And we will call the function like this:
 const px = grabXfromDb() isPi(px) - Cool, yeah? - Not
The problem is that the statement: "We wrap the code in the Promise so that the asynchronous or synchronous code does not steam" is not true. We do not code the code, but Promise is a “something” that can:
sometime in the future:
 px.then(x => //    x    ""  isPi(x) ) So we can remove the redundant code:
 function isPi(x) { return x === 3.14 } const px = grabXfromDb() px.then(isPi) You may ask: okay, the initial code is a bit redundant, what's so bad about it? The problem arises when we try to add a reverse error - it’s very easy to end up with something like:
 function isPi(px) { return px.then(x => return x === 3.14 }) .catch(fuction(e) { assert(e instanceof SomeDBError) // -       }) } This is bad because now our function, through errors, knows too much about the place from where we got the Promise. The correct way to rewrite this code is:
 function isPi(x) { return x === 3.14 } grabXfromDb() .catch(fuction(e) { assert(e instanceof SomeDBError) // some code here }) .then(isPi) A few simple rules:
Source: https://habr.com/ru/post/327560/
All Articles