見出し画像

ジェネレータ関数を使ってnice-color-palettesライブラリのjsonファイルをfetchしてみよう

こんにちわ。nap5です。


ジェネレータ関数を使ってnice-color-palettesライブラリのjsonファイルをfetchするやり方を紹介したいと思います。


ジェネレータ関数とはについては以下のリンクが参考になります。


以前、少し触れていました。


fetchするURLは好きなエンドポイントをチョイスして試されてもいいです。


今回は便利そうだなと思ったnice-color-palettesライブラリのjsonファイルをfetchしてみることにしました。


nice-color-palettesライブラリについてはこちらです。


今回はユースケースとしてN件ずつ取得することを想定します。

このユースケースを達成するためにはfrom,toでデータを管理するとハンディになります。

これをジェネレータ関数で実現したものが以下になります。

function* doBebop(from = 1, index, step, max) {
  step = step - 1;
  while (index < max) {
    index = index + step + 1;
    yield { from, to: index };
    from = index + 1;
  }
}
(() => {
  const iterator = doBebop(1, 0, 3, 10);
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
})();


実行結果はこちらになります。

$ time node index.js
{ value: { from: 1, to: 3 }, done: false }
{ value: { from: 4, to: 6 }, done: false }
{ value: { from: 7, to: 9 }, done: false }
{ value: { from: 10, to: 12 }, done: false }
{ value: undefined, done: true }

real    0m0.071s
user    0m0.051s
sys     0m0.021s


最後の実行により、4回目の実行で最大閾値の10を超えるので、5回目の実行ではundefinedが返ってきます。


それではこのデータをfetchに応用していきます。

以下が応用したプログラムになります。N件ずつ取得する実装になります。

import "isomorphic-fetch";

const doFetch = ({ url }) => {
  return new Promise(async (resolve, reject) => {
    try {
      const response = await fetch(url);
      const json = await response.json();
      resolve(json);
    } catch (error) {
      reject(error);
    }
  });
};

function* doBebop(from = 1, index, step, max) {
  step = step - 1;
  while (index < max) {
    index = index + step + 1;
    yield { from, to: index };
    from = index + 1;
  }
}

const doRequest = ({ info }) => {
  const { value, done } = info;
  if (done) {
    return Promise.resolve([]);
  }
  const { from, to } = value;
  return new Promise(async (resolve, reject) => {
    try {
      const response = await doFetch({
        url: `https://unpkg.com/nice-color-palettes@3.0.0/100.json`,
      });
      resolve(response.slice(from - 1, to));
    } catch (error) {
      reject(error);
    }
  });
};

(async () => {
  const iterator = doBebop(1, 0, 3, 10);
  let result = await doRequest({ info: iterator.next() });
  console.log(result);
  result = await doRequest({ info: iterator.next() });
  console.log(result);
  result = await doRequest({ info: iterator.next() });
  console.log(result);
  result = await doRequest({ info: iterator.next() });
  console.log(result);
  result = await doRequest({ info: iterator.next() });
  console.log(result);
})();


実行結果はこちらになります。

$ time node index.js
[
  [ '#69d2e7', '#a7dbd8', '#e0e4cc', '#f38630', '#fa6900' ],
  [ '#fe4365', '#fc9d9a', '#f9cdad', '#c8c8a9', '#83af9b' ],
  [ '#ecd078', '#d95b43', '#c02942', '#542437', '#53777a' ]
]
[
  [ '#556270', '#4ecdc4', '#c7f464', '#ff6b6b', '#c44d58' ],
  [ '#774f38', '#e08e79', '#f1d4af', '#ece5ce', '#c5e0dc' ],
  [ '#e8ddcb', '#cdb380', '#036564', '#033649', '#031634' ]
]
[
  [ '#490a3d', '#bd1550', '#e97f02', '#f8ca00', '#8a9b0f' ],
  [ '#594f4f', '#547980', '#45ada8', '#9de0ad', '#e5fcc2' ],
  [ '#00a0b0', '#6a4a3c', '#cc333f', '#eb6841', '#edc951' ]
]
[
  [ '#e94e77', '#d68189', '#c6a49a', '#c6e5d9', '#f4ead5' ],
  [ '#3fb8af', '#7fc7af', '#dad8a7', '#ff9e9d', '#ff3d7f' ],
  [ '#d9ceb2', '#948c75', '#d5ded9', '#7a6a53', '#99b2b7' ]
]
[]

real    0m0.838s
user    0m0.235s
sys     0m0.029s


5回目の実行で空配列[]が返ってきているのはfetchに応用する前の理屈と同じです。

最近では、Twitterでモックアップ動画を公開しているので、こちらもよかったら、覗いてみてください。


最後に、Udemyでコースを公開しました。
良かったら覗いてみてください。


また、コースの内容紹介記事は以下になります。


簡単ですが、以上です。

この記事が気に入ったらサポートをしてみませんか?