发表于: 2017-06-21 21:43:13
1 900
今天完成的事情:
看了RxJS的东西,还是懵逼的,什么异步回调,promise再RxJS
明天计划的事情:
再找找什么通俗易懂的RxJS入门
遇到的问题:
RxJS太难理解了
收获:
Rx(Reactive Extension -- 响应式扩展 http://reactivex.io )最近在各个领域都非常火。其实Rx这个货是微软在好多年前针对C#写的一个开源类库,但好多年都不温不火,一直到Netflix针对Java平台做出了RxJava版本后才在开源社区热度飞速蹿升。
我们从最基础的异步回调讲起,然后再从 Promise过渡到 RXJS。
异步回调:
在我们平时编程中,当需要解决异步操作时,用得最多的应该就是把回调函数当做参数传递给异步函数了吧
function print_msg(msg) {
//Do something with msg
console.log(msg);
}
function async_read(callback) {
// Some async_work start
// Async get data from a PORT into msg
// Some async_work end
callback(msg);
}
async_read(print_msg);
在例1中,我们通过传递 print_msg 这个回调函数给异步操作 async_read 以达到当异步操作完成时输出从端口读到的 msg 这个目的。
这样看起来,这种方式简单易懂,但是,真的很好用吗?想象一下,我们所传递的回调函数也是一个异步操作,也需要传入一个回调函数来处理异步结果,
但如果一旦有多层嵌套,这就麻烦了。
于是 Promise 出现了!
Promise:
Promise 很好的将这种嵌套式调用转变成了链式调用,使得代码的可读性维护性都更高。对于例1,我们可以这样:
var promise = new Promise(function(resolve, reject) {
// Some async_work start
// Async get data from a PORT into msg
// Some async_work end
if (/* Async_work successed */) {
resolve(msg);
}
else {
reject(error);
}
});
promise.then(function(msg) {
//Do something with msg
console.log(msg)
}, function(error) {
// Failure, do something here
console.log(error);
});
既然有了 Promise,那么何必再加入 RXJS 这个玩意呢?
Promise 有一个缺点,那便是一旦调用了 resolve 或者 reject 之后便返回了,不能再次 resolve 或者 reject,想象一下,若是从端口源源不断地发来消息,每次收到消息就要通知回调函数来处理,那该怎么办呢?
于是,伟大的 RXJS 又出现了!!
RXJS:
我们已经知道了 Promise 的作用和用法,通过 Promise 对象,我们可以在完成异步工作之后调用 resolve(X) 通知回调函数异步操作已经完成了,并且生产了可使用的 X 对象。既然 RXJS 比 Promise 更厉害,那么它当然也可以完成这个任务,并且可以做得更好
先从官网搬来rxjs的几个实例概念
Observable: 可观察的数据序列.
Observer: 观察者实例,用来决定何时观察指定数据.
Subscription: 观察数据序列返回订阅实例.
Operators: Observable的操作方法,包括转换数据序列,过滤等,所有的Operators方法接受的参数是上一次发送的数据变更的值,而方法返回值我们称之为发射新数据变更.
Subject: 被观察对象.
Schedulers: 控制调度并发,即当Observable接受Subject的变更响应时,可以通过scheduler设置响应方式,目前内置的响应可以调用Object.keys(Rx.Subject)查看。
我们最常用也最关心的Observable,四个生命周期:创建 、订阅 、 执行 、销毁。
创建Obervable,返回被观察的序列源实例,该实例不具备发送数据的能力,相比之下通过new Rx.Subject创建的观察对象实例具备发送数据源的能力。
通过序列源实例可以订阅序列发射新数据变更时的响应方法(回调方法)
响应的动作实际上就是Observable的执行
通过序列源实例可以销毁,而当订阅方法发生错误时也会自动销毁。
序列源实例的catch方法可以捕获订阅方法发生的错误,同时序列源实例可以接受从catch方法返回值,作为新的序列源实例
好吧完全不懂在说什么东西。
评论