質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

635閲覧

【JavaScript】fetch then の綺麗な書き方

true_colors_20

総合スコア25

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2022/09/08 07:04

質問

jsで複数の関数でfetchを使い、getやpostをしています。

サンプルコードでは、getの関数getAllId()、putの関数execution()、それらの関数を実行している関数init()に分けています。

今の書き方だと、init() の中のthen()などが入れ子になりすぎて可読性に欠けると思っています。

このようなことをしたい場合、どのように書くべきなのか教えて頂きたいです。

js

javascript

1class Api { 2 constructor(_parm) { 3 // APIトークン(仮。実際はenvなどに記載する想定です) 4 this.apiToken = 'xxxxxxxxxxxxxxxx'; 5 } 6 7 /** 8 * 全てのIDを取得(GETメソッド) 9 * {[id: 1, hoge: xxx], [id: 2, hoge: yyy]}のようなデータが返ってくる想定 10 * @returns Array 全てのID 11 */ 12 async getAllId() { 13 const url = 'https://xxxxxxxxxxxxx'; 14 const options = { 15 method: 'GET', 16 headers: { 17 Accept: 'application/json', 18 'x-chatworktoken': this.apiToken 19 } 20 }; 21 const response = await fetch(url, options); 22 return response.json(); 23 } 24 25 /** 26 * IDを元に何かを実行(PUTメソッド) 27 */ 28 async execution(_id) { 29 const url = `https://xxxxxxxxxxxxx/${_id}`; 30 const options = { 31 method: 'PUT', 32 headers: { 33 Accept: 'application/json', 34 'Content-Type': 'application/x-www-form-urlencoded', 35 'x-chatworktoken': this.apiToken 36 } 37 }; 38 const response = await fetch(url, options); 39 return response.json(); 40 } 41 42 init() { 43 this.getAllId() 44 .then(_datas => { 45 const arrayIds = _datas.map(_data => _data.id); 46 arrayIds.forEach(_id => { 47 this.execution(_id) 48 .then(_res => { 49 console.log(_res); 50 }) 51 .catch((error) => { 52 console.error('Error:', error); 53 }); 54 ; 55 }); 56 }) 57 .catch((error) => { 58 console.error('Error:', error); 59 }); 60 } 61} 62 63const api = new Api(); 64api.init();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2022/09/08 07:38

init() で async/await を使わないのは何か理由があるのでしょうか。
guest

回答2

0

ベストアンサー

与件として

  • init() の中で行っている処理の then の入れ子を減らしたい、または無くしたい。
  • けれどもinit()をasyncなメソッドにしたくない。(または、しなくてもよい)

というお題で考えてみました。以下はどうでしょう?

javascript

1 init() { 2 (async (api) => { 3 try { 4 const arrayIds = await api.getAllId(); 5 const executors = arrayIds.map(id => api.execution(id)); 6 const responses = await Promise.all(executors); 7 console.log(responses); 8 } catch (error) { 9 console.error('Error:', error); 10 } 11 })(this); 12 }

投稿2022/09/08 07:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

true_colors_20

2022/09/08 09:37

ありがとうございます。具体的な書き方とても参考になりました。
guest

0

どこが気になるのかよくわかりませんが、thenをなるべく排除したいなら
コールバックをasyncにしてfetch処理をawaitで回して戻り値(json?)を一旦変数に受けて
処理すればスッキリするかもしれません。
ただfetch自体のネットワークエラーなどをcatchしたいならやはりthen/catchで
切り分けが必要になるのでご提示のようなソースの流れになるのはしかたないかも

あとは、API側がIDを一度に1つずつしか受け取れないという仕組みがそもそもの
課題のような気がします。複数のIDをもらって全データをjsonで返せるなら
もっとらくな処理になりそうな予感はします

投稿2022/09/08 07:28

編集2022/09/08 07:30
yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問