美文网首页
Rxjs学习之观察者(Observer)与可观察对象(Obser

Rxjs学习之观察者(Observer)与可观察对象(Obser

作者: 一颗粒普斯 | 来源:发表于2018-02-28 14:56 被阅读198次

什么是观察者?

  1. 观察者是有Observable(可观察对象)发送值的消费者
  2. 观察者只是一组回调函数的集合,每个回调函数对应一种Observable发送的通知类型:next,error,complete

什么是可观察对象?

  • 可观察对象(Observable)是一个惰性推送集合,即:要调用Observable并看到这些值,需要订阅Observable:
    observable.subscribe({})

观察者(Observe)的使用
当我们简单的了解了 观察者(Observer)可观察对象(Observable) 两个概念后我们再看看使用方法:

var observer = {
  next: x => console.log('Observer got a next value: ' + x),
  error: err => console.error('Observer got an error: ' + err),
  complete: () => console.log('Observer got a complete notification'),
};

这里有一个回调函数的集合,想要使用观察者需要将它提供给Observable的 subscribe 方法:

observable.subscribe(observer);

这里我们提供了三个回调方法,当然我们也可以只提供部分回调函数数,只是某些通知类型会被忽略

var observer = {
  next: x => console.log('Observer got a next value: ' + x),
  error: err => console.error('Observer got an error: ' + err),
};

也可能只提供一个回调函数作为参数:

observable.subscribe(x => console.log('Observer got a next value: ' + x));

observable.subscribe 内部,他会创建一个观察者对象并使用第一个回调函数作为 next 的处理方法.所有三种类型的回调函数都可以直接作为参数来提供:

observable.subscribe(
    x => console.log('Observable got a next value:'+x),
    err => console.error('Observer got an error: ' + err),
    () => console.log('Observer got a complete notification')
);

可观察对象(Observable)的使用

  • 创建Observable

想使用 可观察对象(Observable) ,首先我们需要先创建

var observable = Rx.Observable.create(function (observer) {
  observer.next(1);
  observer.next(2);
  observer.next(3);
  setTimeout(() => {
    observer.next(4);
    observer.complete();
  }, 1000);
});
  • 订阅Observable

要调用 Observable 并看到这些值,我们需要订阅 Observable:

console.log('just before subscribe');
observable.subscribe({
  next: x => console.log('got value ' + x),
  error: err => console.error('something wrong occurred: ' + err),
  complete: () => console.log('done'),
});
console.log('just after subscribe');

控制台执行结果:

just before subscribe
got value 1
got value 2
got value 3
just after subscribe
got value 4
done
  • 执行Observable
    Observable 执行可以传递三种类型的值:
"Next" 通知: 发送一个值,比如数字、字符串、对象,等等。
"Error" 通知: 发送一个 JavaScript 错误 或 异常。
"Complete" 通知: 不再发送任何值。

下面是 Observable 执行的示例,它发送了三个 "Next" 通知,然后是 "Complete" 通知:

var observable = Rx.Observable.create(function subscribe(observer) {
  observer.next(1);
  observer.next(2);
  observer.next(3);
  observer.complete();
});

Observable 严格遵守自身的规约,所以下面的代码不会发送 "Next" 通知 4:

var observable = Rx.Observable.create(function subscribe(observer) {
  observer.next(1);
  observer.next(2);
  observer.next(3);
  observer.complete();
  observer.next(4); // 因为违反规约,所以不会发送
});

在 subscribe 中用 try/catch 代码块来包裹任意代码是个不错的主意,如果捕获到异常的话,会发送 "Error" 通知:

var observable = Rx.Observable.create(function subscribe(observer) {
  try {
    observer.next(1);
    observer.next(2);
    observer.next(3);
    observer.complete();
  } catch (err) {
    observer.error(err); // 如果捕获到异常会发送一个错误
  }
});
  • 清理Observable执行
    因为 Observable 执行可能会是无限的,并且观察者通常希望能在有限的时间内中止执行,所以我们需要一个 API 来取消执行。因为每个执行都是其对应观察者专属的,一旦观察者完成接收值,它必须要一种方法来停止执行,以避免浪费计算能力或内存资源。

当你订阅了 Observable,你会得到一个 Subscription ,它表示进行中的执行。只要调用 unsubscribe() 方法就可以取消执行。当我们使用 create() 方法创建 Observable 时,Observable 必须定义如何清理执行的资源。

function subscribe(observer) {
  var intervalID = setInterval(() => {
    observer.next('hi');
  }, 1000);

  return function unsubscribe() {
    clearInterval(intervalID);
  };
}

var unsubscribe = subscribe({next: (x) => console.log(x)});

// 稍后:
unsubscribe(); // 清理资源

参阅文档:http://cn.rx.js.org/manual/index.html

相关文章

  • Rxjs学习之观察者(Observer)与可观察对象(Obser

    什么是观察者? 观察者是有Observable(可观察对象)发送值的消费者 观察者只是一组回调函数的集合,每个回调...

  • RxJs - Observerable

    参考文献:RxJS 简介:可观察对象、观察者与操作符 名词解释: Observerable:可观察对象 obser...

  • rxjs学习入门心得(二)观察者

    推荐我的Rxjs教程:Rxjs系列教程目录 Observer (观察者) 什么是观察者?-前面的博客我们讲了Obs...

  • RxJava

    Observable & Observer 观察者(Observer)对可观察对象(Observable)发射的数...

  • 响应式编程和管道

    双向绑定 使用双向绑定文本框中的值始终和name值一致 响应式编程 观察者模式与rxjs,观察者注册可观察对象,可...

  • 观察者模式

    观察者模式(Observer) :又被称作发布-订阅者模式或消息机制,定义了一种依赖关系,解决了主体对象与观察者之...

  • KVO实现

    观察对象添加观察者( observer ): observer中需要实现一下方法:

  • 面試小記

    1:设计模式 观察者模式observer observerble,subscribe (订阅) (1)观察者对象 ...

  • java自带的观察者模式

    Observer对象是观察者,Observable对象是被观察者。 官网api文档:http://docs.ora...

  • 行为型模式——观察者模式

    观察者模式定义 观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象...

网友评论

      本文标题:Rxjs学习之观察者(Observer)与可观察对象(Obser

      本文链接:https://www.haomeiwen.com/subject/dxibxftx.html