Каким образом наблюдаемое излучает значение в соответствии с другим наблюдаемым - PullRequest
0 голосов
/ 12 мая 2019

Итак, скажем, у меня есть 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

1 Ответ

0 голосов
/ 13 мая 2019

Я решил это сам

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);
});
...