Skip to content

Instantly share code, notes, and snippets.

@victor95pc
Last active March 7, 2017 02:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save victor95pc/8e3f8ce70e2ca297d0ee9f1e385e7d9b to your computer and use it in GitHub Desktop.
Save victor95pc/8e3f8ce70e2ca297d0ee9f1e385e7d9b to your computer and use it in GitHub Desktop.
Pages Loader ES6 Module(with Parallelism support) for Ember
import Ember from "ember";
const { RSVP } = Ember;
export function loadPagesInParallel(recordsPromise) {
return recordsPromise.then(getPagesPromisesInParallel).then(waitForAllPromises);
}
export function loadPages(recordsPromise) {
return recordsPromise.then(getPagesPromises).then(waitForAllPromises);
}
function waitForAllPromises(promises) {
return RSVP.all(promises)
.then((allRecords) => {
return allRecords.reduce((allRecords, records) => allRecords.concat(records.toArray()), []);
});
}
function getPagesPromisesInParallel(records) {
return [RSVP.resolve(records), ...getPagesToLoad(records).map(page => loadPage(records, page))];
}
function getPagesPromises(records) {
return getPagesPromisesInChain(records);
}
function getPagesPromisesInChain(records) {
return getPagesToLoad(records).reduce((promises, _, i) => {
return promises.concat([promises[i].then(loadNextPage)]);
}, [RSVP.resolve(records)]);
}
function getPagesToLoad({ meta: { "total-pages": totalPages } }) {
return [...Array(totalPages).keys()].map(p => p + 1).slice(1);
}
function loadNextPage(records) {
return loadPage(records, records.meta['current-page'] + 1);
}
function loadPage(records, page) {
return records.store.query(
records.get("firstObject._internalModel.modelName"),
Object.assign({}, records.query, { page })
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment