JavaScriptフェッチAPIを使用してサーバーからリクエストする場合、次のようなことを行う必要があります
_fetch(API)
.then(response => response.json())
.catch(err => console.log(err))
_
ここで、response.json()
はその約束を解決しています。
重要なのは、_404
_のエラーをキャッチする場合は、応答プロミスを解決してからフェッチプロミスを拒否する必要があるということです。ネットワークエラーが発生した場合はcatch
で終わるだけだからです。したがって、フェッチ呼び出しは次のようになります
_fetch(API)
.then(response => response.ok ? response.json() : response.json().then(err => Promise.reject(err)))
.catch(err => console.log(err))
_
これは、読みにくく、理由付けが難しいものです。だから私の質問は:なぜこれが必要なのですか?レスポンス値としてプロミスを持つことの意味は何ですか?これを処理するより良い方法はありますか?
あなたの質問が「なぜresponse.json()
は約束を返すのですか?」次に@Bergiはコメントで手掛かりを提供します:「それはボディがロードするのを待ちます」。
あなたの質問が「なぜそうでないかresponse.json
属性ですか?」、それからそれはfetch
がボディがロードされるまで応答を返すのを遅らせる必要がありました。
このポリフィルはあなたが望むものを手に入れるでしょう:
var fetchOk = api => fetch(api)
.then(res => res.ok ? res : res.json().then(err => Promise.reject(err)));
その後、あなたは行うことができます:
fetchOk(API)
.then(response => response.json())
.catch(err => console.log(err));
逆はポリフィルできません。