Rxjs 学习笔记 - Observable

147 阅读2分钟

为啥会有Observable

为啥会有Observable? 说是弥补关于数据处理场景的一块空白 -> 推送多个数据

这就比较抽象啊, 这里把我们对数据的处理方式做了俩维度的分类, 如下表格:

TypeSINGLEMULTIPLE
PullFunctionIterator
PushPromiseObservable

那啥是拉和推呢。 现在简单的理解, 我调用获得的, 就是我 pull 来的, 等回调回来的, 就是别人 push 给我的。 可以先看看代码感受一下子。

示例代码示例如下:

  1. 拉取单个数据
function getNum() {
	return Math.floor(Math.random() * 10)
}

function singlePull() {
	const num = getNum()
	console.log(num, 'singlePull')
}
  1. 推送单个数据
function getNumPromise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(getNum())
    }, 1000)
  })
}

// SINGLE Push
function singlePush() {
  const promise = getNumPromise()
  promise.then(num => console.log(num, 'singlePush'))
}
  1. 拉取多个数据
// 迭代器
function* getNumIterator() {
  let i = 0;
  while (i < 3) {
    i++;
    yield getNum();
  }
  return i;
}
// MULTIPLE pull
function multiplePull() {
  const it = getNumIterator()
  while (true) {
    const { value, done } = it.next()
    if (done) break
    console.log(value, 'multiplePull')
  }
}
  1. 推送多个数据
function getNumObservable() {
  return new Observable(subscriber => {
    subscriber.next(getNum())
    subscriber.next(getNum())
    subscriber.next(getNum())
    setTimeout(() => {
      subscriber.next(getNum())
      subscriber.complete()
    }, 200)
  })
}
function multiplePush() {
  const ob = getNumObservable()
  ob.subscribe(val => {
    console.log(val, 'multiplePush')
  })
}

Pull 和 Push

Pull 和 Push 就是两种获取数据的方式。

Pull 就是我要的时候, 就能要到。 生产者无感。 每个js函数都是可以是在 Pull, ES2015的时候, 出了个生成器(就是function*),就弥补了 "拉取多个值" 这块的缺点。

Push 就是我决定啥时候给, 啥时候给你啥时候收, 消费者无感。 典型例子就是 Promise ,你就等 then 吧, 好了的时候自然会 push 给你

下面这个表, 从生产者和消费者的角度, 解释了一下 pull 和 push

生产者消费者
Pull被动: 等着要数据的时候再产生数据主动: 会决定啥时候去要数据
Push主动: 按照自己的节奏产生数据, 然后推出去被动: 就等着数据(等回调)

Observable如何使用

创造 Observable

new 一下, 或者用 操作符 创建;

  • new 一下
const ob = new Observable(subscriber => {
	subscriber.next(1)
	subscriber.next(2)
	subscriber.complete()
})
  • 操作符
of(1, 2, 3)
from([1, 2, 3])
interval(200)

订阅 Observable

of(1,2,3).subscribe(val => {
	console.log(val, 'of')
})

取消订阅 Observable

const subscription = interval(200).subscribe(val => {
    console.log(val, 'interval');
})
setTimeout(() => subscription.unsubscribe(), 1000)

Observable的执行时机

这是一个让人很容易忽略的地方, Observable 是在被 subscribe 了才执行的

这很重要, 是理解“多播”与“单播”的关键点。

let n = 0;
function getNum() {
  return n++;
}

const ob = new Observable(subscriber => {
  subscriber.next(getNum());
})

console.log(n) // 0

ob.subscribe(val => console.log(val, 'unicast')); // 1

参考地址: rxjs.dev/guide/obser…