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();
	})();