12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- <header>
- fetch improved
- </header>
- <body>
- <script>
- const improovedFetch = async (url) => {
- let lukeRes = await fetch(url);
- let luke = await lukeRes.json();
- let result = {};
- let retrievers = [];
- let valueArr = [];
- for (let key in luke) {
- let value = luke[key];
- let isArray = Array.isArray(value);
- if (typeof value == "string") {
- valueArr.push(value);
- }
- else if (isArray) {
- valueArr = value.filter(val => typeof val == "string");
- }
- valueArr = valueArr.filter(val => val.startsWith("https://swapi.dev/api/"));
- if (valueArr.length > 0) {
- for (let urlStr of valueArr) {
- retrievers.push(fetch(urlStr)
- .then(res => res.json())
- .then(
- res => {
- let result =
- {
- key: key,
- val: res,
- isArray: isArray
- };
- return result;
- }));
- }
- }
- else {
- result[key] = value;
- }
- }
- let results = [result, ...await Promise.all(retrievers)];
- results.reduce((a, v) => {
- let { key, val, isArray } = v;
- if (isArray) {
- let aVal = a[key];
- if (!aVal)
- a[key] = aVal = [];
- aVal.push(val);
- }
- else {
- a[key] = val;
- }
- return a;
- });
- return result;
- }
- let res = improovedFetch('https://swapi.dev/api/people/1/');
- </script>
- </body>
|