Skip to content

简介

基本概念

fluth是一个基于promise的流式编程库,擅于异步流程的编排。

假如认为promise是发布者而then方法是订阅者,promise的发布行为则只有一次。

fluth加强了promise,让promise可以不断的发布!

javascript
import { Stream } from "fluth";

const promise$ = new Stream();

promise$.then(
  (r) => console.log("resolve", r),
  (e) => console.log("reject", e)
);

promise$.next(1);
promise$.next(Promise.reject(2));
promise$.next(3);

// Logs:
// resolve 1
// reject 2
// resolve 3

相比其他流式编程库,fluth 更注重异步场景的流程处理,通过fluth可以轻松用流的方式组织异步逻辑,代码的语义和时序将更加清晰。

适用场景

fluth的初衷是为了解决响应式异步编程问题。

在响应式编程中异步操作经常会修改响应式数据,业务代码会采用监听数据的变化来处理异步逻辑;但是采用监听数据变化的方式来组织代码会带来两个问题:1、阅读困难,2、时序混乱。

监听数据是没有语义的,并且丢掉了上下文导致代码阅读困难,哪怕简单的业务代码维护成本也越来越高;复杂业务的异步流程时序也是非常复杂,监听数据变化的方式让控制时序变得困难。

promise其实可以很好的解决这两个问题,每一步的处理都放在then中处理意味着有一条线将所有的逻辑串联起来,任何节点都可以语义化命名,阅读代码整理逻辑将变得非常容易;由于每一条逻辑都是由上而下,串行处理带来的另一个收益就是时序管理简单。

但是promise只能执行一次,而且无法中途停止。fluth则解决了promise的这些问题,可以将fluth看成promise流,能够不断地发布数据,中间的任何一个then节点都可以订阅上游数据,也可以取消订阅。

采用fluth之后,原来网状的响应式逻辑变成了可追踪的流式逻辑:

image

对比 rxjs

rxjs是当前主流的流式编程库,和fluth相比而言有两个明显的区别:

  1. fluth上手非常简单,只要会使用promise就可以使用
  2. rxjs在数据的处理上有更加强大的能力,fluth则更关注观察者的编排:
    • rxjs拥有丰富的operator来实现强大的数据处理能力,但是observer之间是并发的
    • fluth基于promise,更擅长用于observer的编排
javascript
// rxjs:
stream$.pipe(operator1).pipe(operator2).pipe(operator3);
stream$.subscribe(observer1);
stream$.subscribe(observer2);
stream$.subscribe(observer3);
javascript
//fluth:
stream$.then(observer1).then(observer2).then(observer3);
stream$.next(1);