then/catch/finally chainの動作の理解が曖昧なので実験
var p = Promise.resolve(0);
p
.then((v)=>{
console.log("then1:"+v);
return Promise.reject(1);
})
.then((v)=>{
console.log("then2:"+v);
return Promise.resolve(2);
})
.catch(v=>{
console.log("catch1:"+v);
return Promise.reject(-1);
})
.then(v=>{
console.log("then3:"+v);
return Promise.resolve(3);
})
.catch(v=>{
console.log("catch2:"+v);
//return Promise.resolve(-2);
})
.then(v=>{
console.log("then4:"+v);
return Promise.resolve(4);
})
.finally(v=>{
console.log("finally:"+v);
return Promise.resolve(100);
})
.then((v)=>{
console.log("then5:"+v);
})
.catch((v)=>{
console.log("catch3:"+v);
})
いろいろresolve/rejectをいろいろ変えてjsfiddle で実験してみる.
- catchはその前にrejectしたPromiseがある場合にcatchまで飛んでくる. 間にあるthenは飛ばされる.
- catchの前にrejectしたPromiseがない場合は、catchはスキップされその後のthenから実行される
- catchがresolveを返すとそこで一旦リセットされ、その後のthenが実行される
- catchが何も返さない場合も、その後のthenは"undefined"でresolveされた状態で実行される
- finallyはどんな時にも実行される. 引数には何も入ってこない.
- finallyの後にthen, catchを続けても良い
- finallyがその後のthen,catchに与える動作は少し特殊である.
- finally到達時にresolveである場合
- rejectするとその後のcatchまで飛びreject値も通知される.
- resolveをするとその後のthenが実行されるがresolve値を更新することはできない.
- finally到達時にrejectである場合
- resolveしてもその後のthenはskipされcatchまで飛ぶ.
- rejectするとその後のcatchまで飛びreject値も通知される.
つまり、finallyではrejectする場合のみチェーンに影響を与え、resolveは何も影響を与えない。