Get out of Promise Chain
以下のコードを走らせると、"(a)rejected!"が表示される。そこまでは
いいのだが、その後、"(b)resolved!"が表示されてしまう。
SomeProcess()
.then(function(){
if(...error happens...){
return Promise.reject(new Error('fail'));
}
})
.then(function(){
console.log("(a)resolved!");
},function(){
console.log("(a)rejected!");
})
.then(function(){
console.log("(b)resolved!");
},function(){
console.log("(b)rejected!");
});
`reject` はエラーリカバリのためのものであり、
Promise Chainから出るためのものではない。
では、try...catchはどうか?
try{
SomeProcess()
.then(function(){
if(...error happens...){
throw('Error');
}
})
.then(function(){
console.log("(a)resolved!");
},function(){
console.log("(a)rejected!");
})
.then(function(){
console.log("(b)resolved!");
},function(){
console.log("(b)rejected!");
});
}catch(error){
console.log("catch!");
}
結果は最初のケースと同じで、"(b)resolved!"が表示されてしまう。
(ちなみに"catch!"は表示されない。)
then() 内で `throw` すると、`reject` を起こすので、結果は変わらない。
解決方は、async & await を使う。
async function run(){
let result=await SomeProcess();
if(...error happens...){
return;
}
... execute the remaing procedures ...
};
run();
Avoid Promise Nesting
このような then() が nest するコードは。。。
return new Promise((resolve)=>{
Promise.all(promise_list1)
.then(()=>{
PickPrizeModal.run()
.then(()=>{
px.Prize.start()
.then(()=>{
resolve();
});
});
});
});
。。。以下のように async & await に書き換えられる。
return (async function(){
await Promise.all(promise_list1);
await PickPrizeModal.run();
await px.Prize.start();
return Promise.resolve();
})();