@@ -29,17 +29,20 @@ export const client = new HTTPClient({
2929
3030``` typescript
3131import { buildURLData } from ' web-utility' ;
32- import { ListModel } from ' mobx-restful' ;
32+ import { NewData , ListModel } from ' mobx-restful' ;
3333
3434import { client } from ' ./client' ;
3535
3636export type Repository = Record <' full_name' | ' html_url' , string >;
3737
38- export class RepositoryModel extends ListModel <Repository > {
38+ export class RepositoryModel <
39+ D extends Repository = Repository ,
40+ F extends NewData <D > = NewData <D >
41+ > extends ListModel <D , F > {
3942 client = client ;
4043 baseURI = ' orgs/idea2app/repos' ;
4144
42- protected async loadPage(page : number , per_page : number ) {
45+ async loadPage(page : number , per_page : number ) {
4346 const { body } = await this .client .get <Repository []>(
4447 ` ${this .baseURI }?${buildURLData ({ page , per_page })} `
4548 );
@@ -92,85 +95,57 @@ export class RepositoryPage extends WebCell() {
9295
9396### Preload List
9497
95- #### ` model/Repository .ts `
98+ #### ` model/PreloadRepository .ts `
9699
97- ``` diff
100+ ``` typescript
98101import { buildURLData } from ' web-utility' ;
99- - import { ListModel } from 'mobx-restful';
100- + import { BufferListModel } from 'mobx-restful';
102+ import { BufferListModel } from ' mobx-restful' ;
101103
102- import { client } from './client ';
104+ import { RepositoryModel } from ' ./Repository ' ;
103105
104- export type Repository = Record<'full_name' | 'html_url', string>;
105-
106- - export class RepositoryModel extends ListModel<Repository> {
107- + export class RepositoryModel extends BufferListModel<Repository>() {
108- client = client;
109- baseURI = 'orgs/idea2app/repos';
110-
111- protected async loadPage(page: number, per_page: number) {
112- const { body } = await this.client.get<Repository[]>(
113- `${this.baseURI}?${buildURLData({ page, per_page })}`
114- );
115- return { pageData: body };
116- }
117- }
106+ export class PreloadRepositoryModel extends BufferListModel (RepositoryModel ) {}
118107
119- export default new RepositoryModel ();
108+ export default new PreloadRepositoryModel ();
120109```
121110
122111### Multiple Source List
123112
124- #### ` model/Repository.ts `
125-
126- ``` diff
127- - import { buildURLData } from 'web-utility';
128- + import { buildURLData, mergeStream } from 'web-utility';
129- - import { ListModel } from 'mobx-restful';
130- + import { StreamListModel } from 'mobx-restful';
113+ #### ` model/MultipleRepository.ts `
131114
132- import { client } from './client';
133-
134- export type Repository = Record<'full_name' | 'html_url', string>;
135-
136- - export class RepositoryModel extends ListModel<Repository> {
137- + export class RepositoryModel extends StreamListModel<Repository>() {
138- client = client;
139- - baseURI = 'orgs/idea2app/repos';
140-
141- - protected async loadPage(page: number, per_page: number) {
142- - const { body } = await this.client.get<Repository[]>(
143- - `${this.baseURI}?${buildURLData({ page, per_page })}`
144- - );
145- - return { pageData: body };
146- - }
147- + protected openStream() {
148- + return mergeStream(
149- + async function* () {
150- + for (let i = 1; ; i++) {
151- + const { body } = await client.get<Repository[]>(
152- + 'orgs/idea2app/repos?page=' + i
153- + );
154- + if (!body[0]) break;
155- +
156- + yield* body;
157- + }
158- + },
159- + async function* () {
160- + for (let i = 1; ; i++) {
161- + const { body } = await client.get<Repository[]>(
162- + 'users/TechQuery/repos?page=' + i
163- + );
164- + if (!body[0]) break;
165- +
166- + yield* body;
167- + }
168- + }
169- + );
170- + }
115+ ``` typescript
116+ import { buildURLData , mergeStream } from ' web-utility' ;
117+ import { StreamListModel } from ' mobx-restful' ;
118+
119+ import { Repository , RepositoryModel } from ' ./Repository' ;
120+
121+ export class MultipleRepository extends StreamListModel (RepositoryModel ) {
122+ openStream() {
123+ return mergeStream (
124+ async function * () {
125+ for (let i = 1 ; ; i ++ ) {
126+ const { body } = await client .get <Repository []>(
127+ ' orgs/idea2app/repos?page=' + i
128+ );
129+ if (! body [0 ]) break ;
130+
131+ yield * body ;
132+ }
133+ },
134+ async function * () {
135+ for (let i = 1 ; ; i ++ ) {
136+ const { body } = await client .get <Repository []>(
137+ ' users/TechQuery/repos?page=' + i
138+ );
139+ if (! body [0 ]) break ;
140+
141+ yield * body ;
142+ }
143+ }
144+ );
145+ }
171146}
172147
173- export default new RepositoryModel ();
148+ export default new MultipleRepository ();
174149```
175150
176151## Scaffold
0 commit comments