每天实现一个Rxjs中的Operator之Observable.create

Rxjs被越来越多的采用,尤其在Angular中。为了更好的理解Rxjs的工作原理。在这里我们会仿照Rxjs的源码,实现一个简易版的Rxjs
我们知道Rxjs的实现是基于观察者模式来实现的,比如:

Observable.create((observer) => {
  observer.next(1);
  observer.next(2);
}).subscribe({next:(value) => console.log(value)});

在这里,我们调用Observable.create创建了一个可观察对象,在该对象上调用subscribe进行订阅。

首先我们对Observable.create方法进行实现。代码如下所示:
Observable.js

import { toSubscribe } from "./toSubscriber";
export class Observable {
  constructor(subscribe) {
    if (subscribe) {
      this._subscribe = subscribe; //回调方法
    }
  }

  static create(subscribe) {
    return new Observable(subscribe);
  }

  subscribe(observerOrNext) {
    const sink = toSubscribe(observerOrNext);
    this._trySubscribe(sink)
  }

  _trySubscribe(sink) {
    return this._subscribe(sink); //调用创建observable时的回调方法,在回调方法中会执行next方法
  }
}

toSubscribe.js:

import { Subscriber } from "./Subscriber";

export function toSubscribe(nextOrObserver) {
  return new Subscriber(nextOrObserver);
}

Subscribe.js:

export class SafeSubscribe {
  constructor(subscriber, observerOrNext) {
    let next;
    let context = this;
    if (typeof observerOrNext === 'function') {
      next = observerOrNext
    } else if (observerOrNext) {
      next = observerOrNext.next;
      context = Object.create(observerOrNext)
    }
    this.context = context;
    this._next = next;
  }

  next(value) {
    this._next.call(this.context, value);
  }
}

export class Subscriber {

  constructor(destinationOrNext) {
    this.destination = new SafeSubscribe(this, destinationOrNext);
  }

  next(value) {
    this._next.call(this, value);
  }

  _next(value) {
    this.destination.next(value);
  }
}

代码地址

使用RxJSObservable和Subject来处理数据流可以帮助你更好地管理和处理异步操作。 首先,你需要在Angular项目导入RxJS库: ```typescript import { Observable, Subject } from 'rxjs'; ``` 接下来,你可以使用Observable来创建一个可观察对象,它可以发出一个或多个值,并且可以被订阅进行监听。例如: ```typescript const myObservable = new Observable((observer) => { observer.next('Hello'); observer.next('World'); observer.complete(); }); ``` 在上面的示例,我们创建了一个Observable,它发出了两个值('Hello'和'World'),然后通过调用`complete()`方法来表示数据流结束。 你还可以使用Subject来创建一个可观察的主题,它既是一个观察者,也是一个可被订阅的对象。它可以用来向订阅者广播值或事件。例如: ```typescript const mySubject = new Subject<number>(); // 向主题发送数据 mySubject.next(1); mySubject.next(2); // 订阅主题接收数据 mySubject.subscribe((value) => { console.log(value); // 输出:1, 2 }); ``` 在上面的示例,我们创建了一个Subject并向其发送了两个值(1和2),然后通过订阅Subject来接收这些值。 除了上述示例之外,RxJS还提供了丰富的操作符和方法,可以帮助你对数据流进行转换、过滤、组合等操作。你可以使用这些操作符来处理异步操作、处理HTTP请求、处理用户输入等场景。 总结起来,使用RxJSObservable和Subject可以帮助你更好地处理和管理数据流,使你的代码具备更好的可读性和可维护性。你可以根据具体的需求使用RxJS提供的操作符和方法来进行进一步的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值