→ オリジナル記事
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)
いくつかの簡単なルール:
- エラーをできる限りソースに近づけて処理するようにしてください
- コード内の非同期操作と同期操作を明確に分離します。 そうしないと、ほとんどの場合、非常に「リンクされた」コードになります。