Promiseのthenチェーンは基本的に一本道で、thenチェーンは最初から最後まで無条件に実行することを大前提で書くと思います。よって途中で中断させるならkei344さんがおっしゃるようにエラー中断することになると思います。エラー扱いなので当然ながらcatch節が実行されます。
途中で抜けるという意味が正常に中断させることであるとすればthenチェーンの中の任意のthen節で中断させることはできず、最後のthen節で制御を分岐させないといけないのではないでしょうか。
例えばPromiseを返すような関数群a,b,c,dがあったとして、あるケースだけbの後に中断したいなら
javascript
1a()
2.then(b)
3.then(() => {
4 if (...) {
5 c()
6 .then(d)
7 .then(e)
8 }
9})
10.catch(...)
といった具合です。途中で抜けるというよりは、「抜けない場合の処理をthenチェーンの最後のthen節に(入れ子を一段深くする形で)記述する」という感じです。
正常処理としての制御ルートを変化させたい場合、ルートを変えれば変えるほどthenの入れ子構造は深くなっていくと思います。
余談:
途中で抜けることを素直に書く手段としては、例えばPromiseに加えて、co/generator function/yieldを使い、非同期処理をあたかも同期処理であるかのように記述する方法があります。(おそらくkanimaruさんが書かれているページと本質的に考え方は同じではないかと思いますが、coしか知らないので本当かどうか自信ないです)
それを使うとPromiseのthenチェーンはプログラムコード上では単純な文の羅列として書けます。このため、途中で制御を変えたければjavascriptとしてのreturnなどの制御文を普通に使えますし、例外はtry-catchで表現することもできます。あたかもマルチスレッドが利用できる言語で同期処理関数を利用して書いているかのように記述できるので、これはこれで一つの分かり易い方法ではないかと思います。
訂正1: 下記のコード例の文法がはちゃめちゃだったので訂正しました。スミマセン
javascript
1co(function*() {
2 const ra = yield a();
3 ...
4 const rb = yield b();
5 ...
6 if (...) return
7 ...
8 const rc = yield c();
9 const rd = yield d();
10 ...
11});
2017/06/09 01:12