Axios promiseを返すことでさらにチェーンが可能になるが、then()/catch()
メソッドを適用した後に戻ることができない理由を誰かが説明できますか?
例:
const url = 'https://58f58f38c9deb71200ceece2.mockapi.io/Mapss'
function createRequest1() {
const request = axios.get(url)
request
.then(result => console.log('(1) Inside result:', result))
.catch(error => console.error('(1) Inside error:', error))
return request
}
function createRequest2() {
const request = axios.get(url)
return request
.then(result => console.log('(2) Inside result:', result))
.catch(error => console.error('(2) Inside error:', error))
}
createRequest1()
.then(result => console.log('(1) Outside result:', result))
.catch(error => console.error('(1) Outside error:', error))
createRequest2()
.then(result => console.log('(2) Outside result:', result))
.catch(error => console.error('(2) Outside error:', error))
<script src="https://unpkg.com/[email protected]/dist/axios.min.js"></script>
https://jsfiddle.net/nandastone/81zdvodv/1/
Promiseメソッドは連鎖する値を返す必要があることを理解していますが、なぜこれら2つの戻りメソッドに違いがあるのですか?
最初の例は、元のプロミスを返します。 2番目の例は、catch
を呼び出して作成されたdifferentpromiseを返します。
2つの重要な違いは次のとおりです。
2番目の例では、解決値を渡していないため、then
によって返されるpromiseは、undefined
(console.log
の戻り値)で解決されます。
2番目の例では、undefined
を使用して拒否を解像度に変換しています(catch
からconsole.log
の結果を返すことによって)。拒否されたプロミスをスローまたは返さないcatch
ハンドラーは、拒否を解決に変換します。
Promiseチェーンの重要なことの1つは、結果を変換することです。 then
またはcatch
を呼び出すたびに新しいプロミスが作成され、ハンドラーは結果が通過するときにダウンストリームに送信されるものを変更できます。
実際の通常のパターンは、チェーンの結果を返すことですが、チェーン内の関数が意図的に結果を変換するか渡すことです。通常、エラー状態を修正するために(意図的に拒否を解決に変換するために)使用しない限り、チェーンの終端以外にcatch
ハンドラーはありません。
通過したものをログに記録するだけで、呼び出し側はそれを見ることができるが、did何らかの理由でチェーンの結果を返したい場合は、 dこれを行う:
return request
.then(result => { console.log(result); return result; })
.catch(error => { console.error(error); return Promise.reject(error); });
またはthrow
を使用:
return request
.then(result => { console.log(result); return result; })
.catch(error => { console.error(error); throw error; });