他の回答には良い説明を提供しますが、をスキップの概念を用いてこれを表現する方が簡単かもしれません。
場合と約束をを満たす場合、次いでthen
に第引数は(限り、それは関数のように)呼び出されます。 ifと約束はを拒否したときに、その後、then
に二の引数は、(それがある機能である限り)呼び出されます。それ以外の場合、.then
はスキップされます。
純粋主義者は.then
は「スキップ」であり、実際に何が起こっていること.then
と等価である(またはの状態を想定して)新しい約束を作成することであると言うことは間違っているオブジェクトです元約束する。それは技術的には正しかったが、非公式に話して、.then
が「スキップされた」と考えるのは簡単です。
例:
た場合との約束が拒否したときに、その後、catch
の引数は、それがあるとして(呼び出された:完全性については
function log(v) { console.log("value", v); }
function err(e) { console.log("error", e); }
Promise.resolve(1).then(null, err).then(log);
^^^^^^^^^^^^^^^ "SKIPPED" (onFulfilled is null)
Promise.reject(1).then(log).catch(err);
^^^^^^^^^ "SKIPPED" (onRejected is not given)
、catch
のための対応動作です関数)。それ以外の場合は、.catch
はスキップされます。あなたは慎重に考えてみれば
Promise.resolve(1).catch(err).then(log);
^^^^^^^^^^ "SKIPPED" (promise did not reject)
、あなたは、このすべてが.then(null, handler)
が.catch(handler)
にあらゆる方法で正確に同等であることを意味していることがわかります。だからcatch
は、利便性のルーチンの一種と考えることができます。
でもできるが、その後、非機能ハンドラを無視してのポイントは何ですか?代わりにTypeError
などを投げてはいけませんか?実は、これは以下のように使用することができ、「機能」である:それは水曜日の場合は
promise.then(isWednesday && wednesdayHandler)
、これはwednesdayHandler
と評価されますし、我々はいくつかの特別な水曜日の処理を行うことができます。また、それは水曜日ではありません、これは明らかに機能していない、false
に評価されますので、全体then
句は、「スキップ」されます。
@Joeクレイ、torazaburo @、本当に、ちょうど私が尋ねたことについて、私はより明確にし、同じことを説明する2つの方法をご回答の両方を感謝しています。どちらの側面は、すべての詳細と私には素晴らしいです、それは私がちょうど背後にある多くのメカニズムを議論torazaburo年代を受け入れることを申し訳ありませんが、受け入れることを決めたことは困難です。しかし、ジョーも貴重です、皆さん、もう一度ありがとうございます。 – Carr
問題はありません、私はtorazaburoの説明が明確だったと思います:)とにかく、ある程度助けてくれるのはうれしいです! –