Реактивное расширение для Javascript (rxjs) сопоставляет тип возвращаемого значения для Typescript - PullRequest
0 голосов
/ 01 декабря 2018

После этого stackBlitz я попытался испустить серию из N чисел, задерживая каждое излучение со временем задержки, которое является функцией самого числа.Вот код

var subscription = Observable.from(Array.apply(null, {length:N}).map(Number.call, Number))
.pipe(map((iteration) => {
  return timer(iteration)
    .pipe(map(()=>iteration))
}))
.pipe(concatAll())
.subscribe((mappedIteration)=>{
    console.log(Number(mappedIteration)); // prints 0, 1, 2 ... 
})

Переменная mappedIteration имеет тип Observable <{}>.Мои вопросы:

1) почему приведение Number(mappedIteration) работает с типом Observable <{}> и успешно печатает числа 0,1,2,?

2) почему, задайте поведение в1), mappedIteration не относится к типу number, как это происходит в примере со стеком ?

3), существует ли более простой способ «сопоставить» источник значенийв Observable произвольного типа (например, в этом случае, по таймеру)?

1 Ответ

0 голосов
/ 01 декабря 2018

Здесь много чего происходит, в частности, много использования apply и call, и те, как правило, мутят воду системы типов машинописи (особенно потому, что их типизированные версии были только что добавлены в TS 3.2, котораябыл выпущен на этой неделе)

Для вашего третьего вопроса,

3) существует ли более простой способ «сопоставить» источник значений в Observable произвольного типа (например,таймер, в данном случае)?

Да, это будет использовать оператор switchMap;Однако switchMap будет «переключать» наблюдаемый источник на новый для каждого излучения, отбрасывая предыдущие значения.В вашем конкретном примере вас может заинтересовать оператор concatMap: он позволит вам создавать новые наблюдаемые на основе исходных выбросов, следуя порядку предыдущей наблюдаемой.Поэтому следующие наблюдаемые начнутся только после завершения предыдущих.

Наконец, оператор mergeMap позволяет вам «запускать» свои наблюдаемые и запускать их, даже если предыдущиеWerent завершен еще, так что они работают параллельно.Я создал stackblitz , где вы можете попробовать их, аналогично тому, который вы связали.

Я рекомендую вам прочитать это сообщение в блоге , котороеобъясняет, как эти операторы (и другие) работают с хорошими анимациями.

...