Fetches large data sets in chunks (aka pagination). Maintains state internally.
In the constructor you must provide a URL with placeholders for data required by your API.
Let's say you are fetching resources from http://myapi.com/posts
where each page of content is identified by a GET parameter called page. Then your url parameter will look like http://myapi.com/posts?page=<page>
.
The cursor maintains a state object which indicates how far in the data it is. However there are limitless possibilities of required inputs, so continuing the example above, the state object we will need will look like so
{
page: 1
}
Whenever a new page is fetched the cursor must update its internal state in order to be ready to fetch the next one. For this purpose you need to define a setState
method which returns the new state.
After including luri-cursor
in your project you need to extend the abstract class exported in the package and provide your setState
implementation. The method receives the current cursor state and the fetched data as parameters. For our posts example the implementation will look like so
const Cursor = require("luri-cursor");
class PostsCursor extends Cursor {
setState(oldState, posts) {
return {
page: oldState.page + 1
}
}
}
Now we are ready to start fetching some posts.
let cursor = new PostsCursor("http://myapi.com/posts?page=<page>", { page: 1 });
cursor.fetch().then(posts => console.log("First page", posts)).then(() => {
cursor.fetch().then(posts => console.log("Second page", posts))
});
By default it is assumed that the returned data will be in JSON format, if that's not the case you can modify the execute
method to suit your needs. It is given a URL string (populated with data from your state), it must retrieve the data and return a promise, definition below.
execute(url: string): Promise<any>;