Skip to content

Instantly share code, notes, and snippets.

@robertmirro
Last active September 5, 2019 20:07
Show Gist options
  • Save robertmirro/b8651ad34b8e2a1c7d7ba33dfb58f555 to your computer and use it in GitHub Desktop.
Save robertmirro/b8651ad34b8e2a1c7d7ba33dfb58f555 to your computer and use it in GitHub Desktop.
Shazaaaaam!
(() => {
'use strict';
console.clear();
const _fetch = url => { // mock fetch api as _fetch to simulate service call
const page = new URL(url).searchParams.get('page');
return Promise.resolve({
json() {
return {
page,
totalPages: 18,
data: [
{ title: `shazaaaaam_${page}_3`},
{ title: `shazaaaaam_${page}_1`},
{ title: `shazaaaaam_${page}_2`}
]
};
}
});
};
const fetchAllMovieTitles = async baseUrl => {
const url = new URL(baseUrl);
const urlPage = page => {
url.searchParams.set('page', page);
return url.href;
}
try {
const { totalPages, data } = await (await _fetch(urlPage(1))).json();
let movieTitles = [ ...data ];
if (totalPages > 1) {
movieTitles = [
...movieTitles,
...await Promise.all(
new Array(totalPages - 1) // do not include page 1
.fill()
.reduce((movieTitles, value, pageNum) => {
return [
...movieTitles,
_fetch(urlPage(pageNum + 2)) // zero-based index + skipping page 1
.then(response => response.json())
.then(({ data }) => data)
];
}, [])
)
];
}
return movieTitles
.flat()
.map(({ title }) => title)
.sort((s1, s2) => s1.localeCompare(s2, 'en', {numeric: true, sensitivity: 'base'}));
} catch(err) {
console.error(err);
return [];
}
};
fetchAllMovieTitles('https://www.avalonbay.com/movie/shazaaaaam').then(titles => {
titles.forEach(title => {
console.log(title);
})
})
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment