Skip to content

Commit bb6cf3d

Browse files
committed
infinite PreFetch case
1 parent 853e78d commit bb6cf3d

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

src/component/processes/preFetch.ts

+33-8
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import { Process, ProcessStatus, Direction } from '../interfaces/index';
44
export default class PreFetch {
55

66
static run(scroller: Scroller, process: Process) {
7-
const { fetch } = scroller.state;
7+
const { buffer, state: { fetch } } = scroller;
88
scroller.state.preFetchPosition = scroller.viewport.scrollPosition;
9-
fetch.minIndex = scroller.buffer.minIndex;
10-
fetch.averageItemSize = scroller.buffer.averageSize || 0;
9+
fetch.minIndex = buffer.minIndex;
10+
fetch.averageItemSize = buffer.averageSize || 0;
1111

1212
// calculate size before start index
1313
PreFetch.setStartDelta(scroller);
@@ -18,6 +18,11 @@ export default class PreFetch {
1818
// skip indexes that are in buffer
1919
PreFetch.skipBufferedItems(scroller);
2020

21+
if (scroller.settings.infinite) {
22+
// fill indexes to include buffer if no clip
23+
PreFetch.checkBufferGaps(scroller);
24+
}
25+
2126
// add indexes if there are too few items to fetch (clip padding)
2227
PreFetch.checkFetchPackSize(scroller);
2328

@@ -30,7 +35,7 @@ export default class PreFetch {
3035

3136
scroller.callWorkflow({
3237
process: Process.preFetch,
33-
status: scroller.state.fetch.shouldFetch ? ProcessStatus.next : ProcessStatus.done,
38+
status: fetch.shouldFetch ? ProcessStatus.next : ProcessStatus.done,
3439
payload: process
3540
});
3641
}
@@ -108,14 +113,14 @@ export default class PreFetch {
108113
}
109114

110115
static setLastIndexBuffer(scroller: Scroller, startPosition: number, endPosition: number) {
111-
const { state, buffer, settings } = scroller;
116+
const { state, buffer, settings, state: { fetch } } = scroller;
112117
let lastIndex;
113118
if (!buffer.hasItemSize) {
114119
// just to fetch forward bufferSize items if neither averageItemSize nor itemSize are present
115120
lastIndex = state.startIndex + settings.bufferSize - 1;
116121
scroller.logger.log(`forcing fetch forward direction [no item size]`);
117122
} else {
118-
let index = <number>state.fetch.firstIndexBuffer;
123+
let index = <number>fetch.firstIndexBuffer;
119124
let position = startPosition;
120125
lastIndex = index;
121126
while (1) {
@@ -129,11 +134,11 @@ export default class PreFetch {
129134
}
130135
}
131136
}
132-
state.fetch.lastIndex = state.fetch.lastIndexBuffer = Math.min(lastIndex, buffer.absMaxIndex);
137+
fetch.lastIndex = fetch.lastIndexBuffer = Math.min(lastIndex, buffer.absMaxIndex);
133138
}
134139

135140
static skipBufferedItems(scroller: Scroller) {
136-
const buffer = scroller.buffer;
141+
const { buffer } = scroller;
137142
if (!buffer.size) {
138143
return;
139144
}
@@ -165,6 +170,26 @@ export default class PreFetch {
165170
}
166171
}
167172

173+
static checkBufferGaps(scroller: Scroller) {
174+
const { buffer, state: { fetch } } = scroller;
175+
if (!buffer.size) {
176+
return;
177+
}
178+
const fetchFirst = <number>fetch.firstIndex;
179+
const bufferLast = <number>buffer.lastIndex;
180+
if (fetchFirst > bufferLast) {
181+
fetch.firstIndex = fetch.firstIndexBuffer = bufferLast + 1;
182+
}
183+
const bufferFirst = <number>buffer.firstIndex;
184+
const fetchLast = <number>fetch.lastIndex;
185+
if (fetchLast < bufferFirst) {
186+
fetch.lastIndex = fetch.lastIndexBuffer = bufferFirst - 1;
187+
}
188+
if (fetch.firstIndex !== fetchFirst || fetch.lastIndex !== fetchLast) {
189+
scroller.logger.fetch('after Buffer filling (no clip case)');
190+
}
191+
}
192+
168193
static checkFetchPackSize(scroller: Scroller) {
169194
const { buffer, state: { fetch } } = scroller;
170195
if (!fetch.shouldFetch) {

0 commit comments

Comments
 (0)