javascript - 書き換え - js タイトル
関数からAxiosの約束を返す (1)
あなたの最初の例は元の約束を返します。 2番目の例は、 catch
と呼ばれる別の約束を返します。
両者の重要な違いは次のとおりです。
2番目の例では、解決値を渡すわけではないので、返された約束は
undefined
(console.log
戻り値)で解決されます。2番目の例では、拒否を
undefined
解決に変換しています(console.log
の結果をcatch
から戻すことによって)。 拒否された約束をスローまたは返さないcatch
ハンドラは、拒否を解決に変換します。
約束のチェーンについての重要なことの1つは、結果が変わることです。 then
以降の呼び出しは新しい約束を作成し、ハンドラは結果がそれらを通過するときに下流に送信されたものを変更することができます。
通常のパターンは実際にはチェーンの結果を返すことですが、チェーン内の関数が結果を意図的に変換するか、それを渡すかのどちらかです。 通常は、エラー状態を修正するために使用しない限り(拒否を解像度に意図的に変換する)、チェーンの終端以外はcatch
ハンドラを持たないでしょう。
通話者が通話を許可している間に通ったものだけをログに記録したいが、何らかの理由でチェーンの結果を返すことを望んでいた場合は、次のようにします。
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; });
誰かがなぜAxiosの約束を返すのがなぜ後の連鎖を許すのか説明してもいいですが、 then()/catch()
メソッドを適用した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/
プロミスのメソッドは連鎖する値を返さなければならないが、なぜこれら2つのリターンメソッドの違いがあるのだろうか?