2015-12-11 9 views
6

は、私は他の多くの例を試してみたが、最初then()はその約束を返すように見える結果がネイティブPromiseチェーンで「キャッチ」はどのように機能しますか?

1 "err" 10 
2 "res" undefined 

なりクロムまたはFirefox

var p = new Promise(function(resolve, reject) { 
    setTimeout(function() { 
     reject(10); 
    }, 1000) 
}) 

p.then(function(res) { console.log(1, 'succ', res) }) 
.catch(function(res) { console.log(1, 'err', res) }) 
.then(function(res) { console.log(2, 'succ', res) }) 
.catch(function(res) { console.log(2, 'err', res) }) 

のコンソール]タブ上のコードのこの部分を試してみてください常に解決し、決して拒否しません。私はChrome 46.0.2490.86とFirefox 42.0でこれを試しました。なぜこれが起こるのですか?私はthen()catch()が何度も連鎖できると思った?ただ、同期コードのよう

+0

[連鎖約束は拒絶を通過しない](http://stackoverflow.com/q/16371129/1048572) – Bergi

答えて

7

:例外が処理された後に実行

try { 
    throw new Error(); 
} catch(e) { 
    console.log("Caught"); 
} 
console.log("This still runs"); 

コードが実行されます - 例外がエラー回復メカニズムされているためです。そのキャッチを追加することで、エラーが処理されたことが通知されました。同期の場合では、再スローすることによって、これを処理します。

try { 
    throw new Error(); 
} catch(e) { 
    console.log("Caught"); 
    throw e; 
} 
console.log("This will not run, still in error"); 

約束も同様に動作します。ヒントとして

Promise.reject(Error()).catch(e => { 
     console.log("This runs"); 
     throw e; 
}).catch(e => { 
     console.log("This runs too"); 
     throw e; 
}); 

- あなたは意味のスタックのような便利なものの多くを失うとして非Error Sと拒否したことがありませんトレース。

2

これはなぜ起こるのでしょうか?私はthen()とcatch()が複数回連鎖できると思った?

@Benjaminは、1の権利であるが、別の方法でそれを置くために、これらのルールです:

  • あなたはthenを複数回追加した場合、あなたは順番に呼び出されるべきメソッドを連鎖しています例外がスローされるまでthenチェーンの例外は、thenの後に宣言されたcatchで処理する必要があります。 thenの後にcatchがない場合、このエラーが発生します:Uncaught (in promise) Error(…)
  • あなたはcatchを複数回追加した場合、あなたは何かが(前then機能で)うまくいかないときに呼び出されるメソッドを連鎖されています。ただし、チェーン内の2番目のcatchは、最初の例外が例外を再スローした場合などにのみ呼び出されます。
  • catchがトリガされると、次のthenのチェーン再開はcatch後に宣言しました。
関連する問題