web-dev-qa-db-ja.com

JavaScriptフェッチAPIからの応答オブジェクトが約束されるのはなぜですか?

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))
_

これは、読みにくく、理由付けが難しいものです。だから私の質問は:なぜこれが必要なのですか?レスポンス値としてプロミスを持つことの意味は何ですか?これを処理するより良い方法はありますか?

31
amb

あなたの質問が「なぜ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));

逆はポリフィルできません。

22
jib