Published
Edited
Oct 19, 2020
1 fork
Importers
5 stars
Insert cell
Insert cell
mikesNotebooks = {
return "paginated query, proxied, to be run manually"; // comment out to run
return fetchAllPublicNotebooksShowingProgress("@mbostock");
}
Insert cell
async function* fetchAllPublicNotebooksShowingProgress(user) {
yield showProgress();
let notebooks = await fetchPublicNotebooks(user);
let allNotebooks = notebooks.results;
const pageCount = Math.ceil(notebooks.total / notebooks.per_page);
for (let page = 2; page <= pageCount; page++) {
yield showProgress(page, pageCount);
// be nice to the server, see: https://talk.observablehq.com/t/suitable-rate-limit-for-document-id-meta/3886/2
Promises.delay(1000);
notebooks = await fetchPublicNotebooks(user, page);
allNotebooks = allNotebooks.concat(notebooks.results);
}
yield allNotebooks;
}
Insert cell
showProgress = (value = 0, max = 1) => html`<progress value="${value}" max="${max}"></progress>`
Insert cell
fetchAllPublicNotebooks = async (user) => {
let notebooks = await fetchPublicNotebooks(user);
let allNotebooks = notebooks.results;
const pageCount = Math.ceil(notebooks.total / notebooks.per_page);
for (let page = 2; page <= pageCount; page++) {
Promises.delay(1000); // be nice to the server
notebooks = await fetchPublicNotebooks(user, page);
allNotebooks = allNotebooks.concat(notebooks.results);
}
return allNotebooks;
}
Insert cell
// sorted by publication date in descending order (the most recent ones first)
fetchPublicNotebooks = async (user, page = 1) => {
const url = getUrl(user, page);
const response = await fetch(url);
if (!response.ok) {
throw response.statusText;
}
return response.json();
}
Insert cell
getUrl = (user, page) => {
const proxyUrl = "https://observable-cors.glitch.me"; // cors-anywhere.herokuapp.com doesn't work; to be clarified
const apiUrl = "https://api.observablehq.com";
return `${proxyUrl}/${apiUrl}/documents/${user}?page=${page}`;
}
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more