一个 Observable 如何根据另一个 Observable 发出值
How an Observable emits value according to another Observable
所以,比方说,我有一个 Observable,它是从一个带有时间戳值的巨大有序数组创建的,我还有另一个 Observable,它是从事件创建的(基本上每秒发出四次时间戳)。
问题来了,我如何实现才能让第二个 Observable 发射值,第一个 Observable 发射所有值,直到达到大于第二个 Observable 发射值的值,然后等待第二个 Observable 继续发射
保持简短是一个 Observable 一直发射,直到它大于另一个 Observable 的发射值。
e.g. :
Observable A [1,1.1,1.5,1.7,2,5,7]
Observable B [1,2,3,4,5,6,7,8]
B emit 1 -> A emit 1, wait
B emit 2 -> A emit 1.1 1.5 1.7 2 wait
B emit 3........
B emit 7 -> A emit 7
B emit 8 -> A over
加上:B 是可寻的
e.g. :
Observable A [1,1.1,1.5,1.7,2,5,7]
Observable B [1,2,3,4,5,6,7,8]
B emit 1 -> A emit 1, wait
B emit 2 -> A emit 1.1 1.5 1.7 2 wait
B emit 3........
suddenly B seek to 2
B emit 2 -> A emit the one in A array which closest to 2
then keep moving
B emit 7 -> A emit 7
B emit 8 -> A over
我自己解决了
const time$ = fromEvent(v, 'timeupdate').pipe(map(a => v.currentTime));
let lastIndex = 0,
lastTime = 0;
const danmaku$ = new Observable(subscriber => {
time$.subscribe(time => {
const index = search(data, time);
if (Math.abs(time - lastTime) > 1) {
// user drag the progress bar
subscriber.next(data[index]);
} else {
for (let i = lastIndex; i < index; i++) {
subscriber.next(data[i]);
}
}
lastIndex = index;
lastTime = time;
});
});
danmaku$.subscribe(d => {
console.log(d.time, d.content);
});
所以,比方说,我有一个 Observable,它是从一个带有时间戳值的巨大有序数组创建的,我还有另一个 Observable,它是从事件创建的(基本上每秒发出四次时间戳)。
问题来了,我如何实现才能让第二个 Observable 发射值,第一个 Observable 发射所有值,直到达到大于第二个 Observable 发射值的值,然后等待第二个 Observable 继续发射
保持简短是一个 Observable 一直发射,直到它大于另一个 Observable 的发射值。
e.g. :
Observable A [1,1.1,1.5,1.7,2,5,7]
Observable B [1,2,3,4,5,6,7,8]
B emit 1 -> A emit 1, wait
B emit 2 -> A emit 1.1 1.5 1.7 2 wait
B emit 3........
B emit 7 -> A emit 7
B emit 8 -> A over
加上:B 是可寻的
e.g. :
Observable A [1,1.1,1.5,1.7,2,5,7]
Observable B [1,2,3,4,5,6,7,8]
B emit 1 -> A emit 1, wait
B emit 2 -> A emit 1.1 1.5 1.7 2 wait
B emit 3........
suddenly B seek to 2
B emit 2 -> A emit the one in A array which closest to 2
then keep moving
B emit 7 -> A emit 7
B emit 8 -> A over
我自己解决了
const time$ = fromEvent(v, 'timeupdate').pipe(map(a => v.currentTime));
let lastIndex = 0,
lastTime = 0;
const danmaku$ = new Observable(subscriber => {
time$.subscribe(time => {
const index = search(data, time);
if (Math.abs(time - lastTime) > 1) {
// user drag the progress bar
subscriber.next(data[index]);
} else {
for (let i = lastIndex; i < index; i++) {
subscriber.next(data[i]);
}
}
lastIndex = index;
lastTime = time;
});
});
danmaku$.subscribe(d => {
console.log(d.time, d.content);
});