|
@@ -0,0 +1,61 @@
|
|
|
+<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>
|