LoginSignup
3
1

JavaScriptでのAPIでのデータの表示 fetch (初心者)

Last updated at Posted at 2024-05-10

はじめに

ウェブ開発において、外部APIを利用してデータを取得し、ウェブページに動的なコンテンツを表示することは一般的なタスクです。

本記事では、Vanilla JSを使用して外部APIからデータを取得し、それをウェブページに表示する方法について学習したことをまとめました。

APIの概要

API(Application Programming Interface)とは

APIは、アプリケーション間でデータをやり取りするためのインターフェース。
クライアントがサーバーにリクエストを送信し、サーバーはそのリクエストを処理して必要なデータを提供する。
主にJSON形式が利用され、これによりデータのやり取りが容易になり、さまざまなプラットフォームや言語での利用が可能。

非同期処理

プログラムは上から順に処理されるため、一つの処理が終わらないと、次の処理を実行できない。つまり処理中はクリック、スクロールなどの操作は不可能。

これを解決するために、バックグラウンドで処理を実行する非同期処理が開発された。

最初は、setTimeout関数とコールバック関数を使って非同期処理を行なっていたが、コールバック関数の中にコールバック関数をネストし非常にコードが読みにくくなるという問題があった。
そのため、Promiseというオブジェクトが導入された。

基本構文
Promise(function(resolve,reject) {
    resolve("hello");    // resolveが呼ばれたら次のthenへ移行
}).then(function(data) {  
    console.log(data);   // dataはresolve↑の引数.ここではhello
    return data;         // 次のthenに値を渡すためにはreturnとする
}).then(
    コールバック関数(data)  
).finally(
    コールバック関数        // finallyにはデータを渡すことができない
)

Promiseを使うと、非同期処理が直列に繋がり、処理の流れが明確になる。

また、関数に対してasyncキーワードを付けることで、その関数を非同期関数として定義することができる。
awaitキーワードを使うと、Promiseの値が返ってくるまで処理を待機する

非同期処理はこのyoutubeがとてもわかりやすかったです。

こちらのqiitaは大変丁寧でPromiseの理解が大幅に進みました。
ありがとうございます

データの取得

windowオブジェクトの中にある、fetchというメソッドを使う。引数はリクエスト先のAPIのURL。
fetchで返ってくるのはPromiseオブジェクト。(windowはグローバルオブジェクトなので省略可能)

console.log(window.fetch('https://jsonplaceholder.typicode.com/todos'));

Screenshot 2024-05-08 at 22.13.01.png
fetchメソッドの返り値はPromiseオブジェクト。ここで
Promiseオブジェクトをthenに渡し、引数をconsoleで確認すると

fetch('https://jsonplaceholder.typicode.com/todos').then((response) =>
  console.log(response)
);

Screenshot 2024-05-08 at 22.17.27.png

Responseオブジェクトが返ってくる
ここでしっかり情報が取得できたか確認できる
さらにResponseオブジェクトに対しjsonメソッドを使うことで使いたい情報を得ることができる

fetch('https://jsonplaceholder.typicode.com/todos')
  .then((response) => response.json())
  .then((data) => console.log(data));

// 配列でとり出して、中身はオブジェクトのように扱える
fetch('https://jsonplaceholder.typicode.com/todos')
  .then((response) => response.json())
  .then((data) => console.log(data[0]));

Screenshot 2024-05-08 at 22.22.03.png

Screenshot 2024-05-08 at 22.23.48.png

jsonの中身はそれぞれ違うので、取得したらデータの中身を確認

fetch('https://www.jma.go.jp/bosai/common/const/area.json')
  .then((response) => response.json())
  .then((data) => console.log(data.centers['010100']));

Screenshot 2024-05-09 at 21.10.12.png

async / await

上のfetch().then()を
async/ await を使うことでわかりやすく記述できる。

非同期処理があっても上から下へ読める!

async function fetchdata {
    const response = await fetch('URL');
    const characters = await response.json();
    ...
}

簡単に記述することができる

プラス

このクイズを解いてみるとasync / await をもっと理解できます。

Q. )1と出力後1s後に2,3と出力する

const test = () => {
    cosole.log(1);
    return new Promise((resolve) => { // return がないと出力: 1,3,2となる
        setTimeout(() => {
            console.log(2);
            // resolve();   これがないと出力結果が1,2で止まる
        }, 1000)
    })
}

const main = async() => {
    await test();
    console.log(3);
}

main()

awaitはPromiseが帰ってくるまで待つ!これ大切ですね


new Promise((resolve) => {
  console.log(1);
  resolve();
})
  .then(() => {
    return new Promise((resolve) => {
      setTimeout(() => {
        console.log(2);
        resolve();
      }, 1000);
    });
  })
  .then(() => {
    console.log(3);
  });

Promiseだけで書くと確かにネストが読みにくくなりますね。

おわり

今回自己満足的アウトプット記事を書いてみたところ、想像以上に理解が深まりました。間違っている箇所があれば指摘していただければ幸いです。

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1