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

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

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

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1642閲覧

APIから読み込んだJSONをReactのStateにセットしたい

ryuto.nakamura

総合スコア60

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/06/03 08:56

###実現したいこと
APIを読み込み、ReactのStateにセットしたい

javascript

1const getTasksApi = () => { 2 //APIを読み込む処理 3 //何種類か試しました。試したものは下に書いてあります。 4} 5 6class App extends React.component { 7 constructor() { 8   this.state = { 9 tasks: getTaskApi(); 10 } 11} 12

###試したこと

  • fetchを使ってAPIを読み込む => getTaskApiでreturnできない

javascript

1const getTasksApi = () => { 2 fetch('https://script.google.com/macros/s/*********/exec') 3 .then(tasks => tasks.json()) 4 .then(json => json); 5}
  • XMLHttpRequestを使う => 読み込みよりも先にreturnされて、undefindになってしまう

javascript

1const getTaskApi = () => { 2 let tasks; 3 const request = new XMLHttpRequest(); 4 request.open('GET', 'https://script.google.com/macros/s/*********/exec', true); 5 request.responseType = 'json'; 6 request.onload = function () { 7 tasks = this.response; 8 }; 9 request.send(); 10 return tasks 11}

###環境
node: v12.16.1
create-react-app: 3.4.1

MacOS, VSCode, Firefox Developer Edition

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。fetch を使った方のコードで、修正前の

javascript

1const getTasksApi = () => { 2 fetch('https://script.google.com/macros/s/*********/exec') 3 .then(tasks => tasks.json()) 4 .then(json => json); 5}

だと、関数 getTasksApi 自体は、何も返していないので意図通りになっていないものと思います。ですので、 => の後の { と最後の } を削除して、以下のようにするといかがでしょうか?

修正後

javascript

1const getTasksApi = () => 2 fetch('https://script.google.com/macros/s/*********/exec') 3 .then(tasks => tasks.json()) 4 .then(json => json);

追記

以下のように修正してみると、いかがでしょうか?

修正前

javascript

1const getTasksApi = () => { 2 //APIを読み込む処理 3 //何種類か試しました。試したものは下に書いてあります。 4} 5 6class App extends React.component { 7 constructor() { 8   this.state = { 9 tasks: getTaskApi(); 10 } 11 }

Appconstructor() では、 this.state.tasks を空の配列で初期化しておいて、componentDidMount() でAPIを呼び、その結果で this.setStatetasks を更新します。このとき、レスポンスが返ってくるために待つために、 async と await を使います。

修正後

javascript

1const getTasksApi = async () => 2 fetch('https://script.google.com/macros/s/*********/exec') 3 .then(tasks => tasks.json()); 4 5class App extends React.component { 6 constructor() { 7   this.state = { 8 tasks: [] 9 } 10 } 11 12 componentDidMount() { 13 const tasks = await getTasksApi(); 14 this.setState({ tasks }); 15 } 16 17・・・

投稿2020/06/03 09:45

編集2020/06/03 11:48
jun68ykt

総合スコア9058

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

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

ryuto.nakamura

2020/06/03 11:28 編集

早速の回答ありがとうございます。 試したところ、想定通りには動きませんでした。 コンソールに表示してみると、` Promise { <state>: "pending" } `がリターンされているようです。
jun68ykt

2020/06/03 11:50

コメントありがとうございます。 回答に書いた修正は、getTasksApi を、とりあえず何か返すようにしただけの修正でした。 さらに、App からこれを呼んで、this.state に結果を入れるための修正を追記しましたので、参考にして頂ければと思います。手元で動かして確認したわけではないので、すべての問題が解決されて、意図通り動くかは分かりませんが、何らか進展があると思います。
jun68ykt

2020/06/03 11:53

補足です。 追記したコードは、APIのレスポンス全体が配列である想定のものになっていますので、レスポンス全体としてはオブジェクトで、その中の何らかのプロパティとして配列があるのであれば、修正が必要と思われます。
ryuto.nakamura

2020/06/03 12:06 編集

追記ありがとうございます。 指定いただいたコードを実行してみたところ、"await"は"async"の中でしか使えないという旨のエラーが出ました。 awaitを削ってみるとstateにgetTasksApi()の結果は入ったようですが、getTaskApi()の返り値 が相変わらずPromise{<state>: "pending"}のままです。 >補足 APIは配列です。 何度も質問ばかりで、お手数をかけてすみません。よろしくお願いします。
jun68ykt

2020/06/03 12:13

大丈夫ですよー???? > "await"は"async"の中でしか使えないという旨のエラー の件、たしかにそうですね。ちょっと見落としていました。なので、以下のように、componentDidMount の前にも async を付けると、どうでしょう? 修正前 componentDidMount() 修正後 async componentDidMount()
ryuto.nakamura

2020/06/03 12:24

返信ありがとうございます。 asyncをつけた上で、 .then(json => { tasks = json }); return tasks; をgetTasksApi()に追加したところ、期待通りに動きました。 ありがとうございました。
jun68ykt

2020/06/03 12:40

どういたしまして。 > 期待通りに動きました。 とのことでよかったです????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問