创建:把任何东西变成一条流
有了 契约 那十几行 Observable,下一步就是造流。RxJS 提供一组 creation function,把现成的值、数组、Promise、定时器、DOM 事件统统包成同一种 Observable,从此都能用同一套 operator 处理。下面选一个
creator,用「下一步」推进时间游标,看它在 marble diagram 上如何随时间吐出值,并用竖线 complete 收尾(无限流则不收尾)。
形态各异,契约一致。 of / from(iterable) 是同步逐个推、推完立即 complete;from(promise) 等 Promise resolve 后推一个值再 complete;timer 延迟一段后推一个 0 再 complete;interval
/ fromEvent 则永不 complete——一个按固定节奏无限计数,一个随外部事件不定时地推。但无论来源如何,它们都遵守 next* (error | complete)? 这一条契约,下游用同一套 operator 就能处理。
1 · cold + lazy:Observable 只是配方,不订阅什么都不发生
上面每个 creator 都是 cold 的:producer(吐值的那段逻辑)被封存在 Observable 里,只有 subscribe 的那一刻才执行,而且每次订阅都从头重新跑一遍——两个订阅者拿到的是两次互不相干的独立执行。下面这条 cold$ 的 producer
每次运行都重新掷一个随机基数再推三个值;点 subscribe 就订阅一次,看订阅次数与 producer 执行次数始终相等,且每次收到的值各自独立。
cold 的代价与 hot 的解法。 cold 的独立执行很干净,但也意味着:若 producer 里是一个网络请求,那么每个订阅者都会各发一次。当你希望多个订阅者共享同一次执行(晚来的接着看,而不是重跑),就需要把 cold 流转成 hot 流——用 Subject /
share multicast。这正是 冷与热 那页的主题。