はじめに
then
関数に新しいPromiseオブジェクトを返す機能があるので、then
内でPromiseをreturnする処理を書かなくても、Promiseはメソッドチェーンが可能だということを最近知ったのでメモ。
Promiseチェーンの色々な例
はじめに
で述べたことを理解するために、色々なタイプのPromiseをメソッドチェーンで繋ぎます
returnなし
then()
内でreturnしない場合でも、then
が新しいPromiseを返してくれるのでメソッドチェーンが可能です
// new Promise(resolve => resolve()) と同じ const promise = Promise.resolve(); // 実行結果 // A // B // C promise.then(console.log('A')) .then(console.log('B')) .then(console.log('C'));
returnあり
チェーンの次の処理に前の処理の結果を渡したい場合は、then()
内に渡したい値をreturnする処理を書く必要があります。
returnした値はthenの機能でPromiseオブジェクトに変換されるので、数値や文字列だけでなく、オブジェクトでもPromiseでもどの値を返しても、Promiseはメソッドチェーンが可能です
数値を伝搬するPromiseチェーン
数値をreturnで次の処理に渡しています。returnした数値はthenの機能でPromiseオブジェクトに変換して渡されます
// new Promise(resolve => resolve()) と同じ const promise = Promise.resolve(); // 実行結果 // 6 // arrow functionを使っているのでreturnは省略されているが、 // 実際には数値がreturnされている promise.then(() => 1) .then(value => value + 2) .then(value => value + 3) .then(value => console.log(value));
Promiseを伝搬するPromiseチェーン
PromiseをPromiseチェーンを使って次の処理に渡すこともできます。
次の例では、戻り値がPromiseのサードパーティ製ライブラリのメソッドをreturnしています。
// 戻り値がPromiseのメソッド this.keychainTouchId.isAvailable() .then((res: any) => { // 戻り値がPromiseのメソッド return this.keychainTouchId.has(BioAuthService.KEY_A); }).then((res: any) => { // 戻り値がPromiseのメソッド return this.keychainTouchId .verify(BioAuthService.KEYCHAIN_KEY, `ロックを解除してください`); }).then((res: any) => { this.password = res; // 戻り値がPromiseのメソッド return this.storage.get(BioAuthService.KEY_B); }).then((res: any) => { this.userId = res; const params = { loginId: this.userId, password: this.password, deviceToken: null }; this.action.login(params); }).catch((error: any) => { // catchは一つでよい console.error(error); });
結論
何も考えずにthen
でつないどけば、Promiseはメソッドチェーンが可能