# 程序控制流

经典的程序控制流程更贴近汇编语言:

  • 顺序、分支、循环
  • 函数调用
  • 异常处理

但是随着业务越来越复杂,现代编程语言出现了几个新的控制流程:

  • 协程/Generator
  • Promise
  • Observable

人们进行升维思考,也提出了一些新的理论:

  • 程序无非就是数据的流动和加工
  • 生产者产生数据,消费者消费/加工数据
  • 生产者和消费者之间有两种通信模型:Pull模型、Push模型
返回值数量 同步、异步 PULL、PUSH 惰性求值
函数调用 1 同步 PULL 惰性求值
协程、Generator 多个 同步 PULL 惰性求值
Promise 1 异步 PUSH 立即求值
Observable 多个 同步或异步 PUSH 惰性求值

# Promise vs. Observable

下面这段代码体现了 Promise 的几个特性:异步、立即求值。

const promise1 = new Promise((resolve, reject) => {
  console.log('111');  // 111 比 222 先输出,所以是立即求值
  resolve('444');  // 最后输出,所以是异步
});
console.log('222');
promise1.then((value) => {
  console.log(value);
});
console.log('333');

相比之下,Observable 就是同步、惰性求值的。

import { Observable } from 'rxjs';

const observable = new Observable((subscriber) => {
  console.log('222');  // 222 比 111 后输出,所以是惰性求值
  subscriber.next('333');  // 比 444 先输出,所以是同步
});
console.log('111');
observable.subscribe((value) => {
  console.log(value)
});
console.log('444');

# 概念和名词解释

  • Observable 是数据的生产者
  • Observer 是数据的消费者: observable.subscribe(observer);
  • Operators 就是函数,分为 Pipeable Operators、Creation Operators 两种
  • Pipeable Operations observableInstance.pipe(operator())

Pipeable Operation 是纯 (Pure) 的,会创建新的 Observable,不会修改原来的 Observable。

Creation Operator 用于创建 Observable。