Promiseですべてをラップする必要はありません

オリジナル記事


isPi関数を開発していると想像してください:


 function isPi(x) { return x === 3.14 } 

そして誰かが言う:「データがどこから来たか(データベース、ネットワークなど)を知りたくないので、Promiseでコードをラップしましょう」:



 function isPi(px) { return px.then(x => return x === 3.14 }) } 

そして、次のような関数を呼び出します。


 const px = grabXfromDb() isPi(px) 

-かっこいい? -いいえ


問題は、「非同期または同期コードが処理されないように、Promiseでコードをラップする」というステートメントが正しくないことです。 コードをラップしませんが、Promiseは次のことが可能な「何か」です。



将来のいつか:


 px.then(x => //    x    ""  isPi(x) ) 

したがって、冗長なコードを削除できます。


 function isPi(x) { return x === 3.14 } const px = grabXfromDb() px.then(isPi) 

あなたは尋ねるかもしれません:さて、最初のコードは少し冗長です、それで何が悪いのですか? エラーリターンを追加しようとすると問題が発生します。次のようなもので終了するのは非常に簡単です。


 function isPi(px) { return px.then(x => return x === 3.14 }) .catch(fuction(e) { assert(e instanceof SomeDBError) // -       }) } 

これは、Promiseを取得した場所について、エラーを介して関数が認識しすぎているためです。 このコードを書き換える正しい方法は次のとおりです。


 function isPi(x) { return x === 3.14 } grabXfromDb() .catch(fuction(e) { assert(e instanceof SomeDBError) // some code here }) .then(isPi) 

いくつかの簡単なルール:




Source: https://habr.com/ru/post/J327560/


All Articles