参考:https://zhuanlan.zhihu.com/p/27678951 知乎:响应式编程

响应式编程是一种基于异步数据流概念的编程模式。
响应式编程的关键概念:事件
设计模式:观察者模式

响应式编程

  • 响应式: 快速/一致的响应时间。无论并发操作多少,都尽量控制在一定时间内。
  • 韧性: 其实就是隔绝,避免连锁性问题的发生。
  • 弹性: 可扩展。
  • 消息驱动: 异步/松耦合/隔绝/地址透明/错误作为消息/背压/无阻塞。

错误作为消息:在Java中,通常将错误直接作为异常抛出,而在响应式编程中,错误也是一种消息,和普通消息地位一致。
背压:当上游向下游推送数据时,可能下游承受能力不足导致问题。

同步和异步

分布式网络系统中,各个参与方节点的运行是相互独立的,没有共享内存,没有全局时钟。各节点通过消息来进行沟通。在传统的理念中,我们会把这样的网络根据他们通信方式描述成同步和异步的。

回到编程:编程也可以分为同步和异步,同步编程就是发出任务,等待执行。异步编程是发出一个任务,不等待结果,就继续发出下一个任务。发完了,当然要接收反馈了,也就是去获取任务执行结果,我们可以使用两种方式去获得结果,一个是主动轮询(Proactive),一个是被动接收反馈(Reactive)。
异步编程不用去等结果,如果他依赖那个结果对象的话,那么他只要定期去问一下就好了 ,或者再开一个线程去专门接收它。那不就不会阻塞了?

过渡到响应式编程

上面提到了异步编程,我们使用两种方式去拿结果,好了,Reactive,被动接收反馈,在这种方式下,上一个任务的结果反馈就是一个事件,这个事件来触发下一个任务执行。

部分术语

  • 依赖链: 就是你发生什么事情是要基于什么事发生后的,比如 睡觉 -> 吃饭 ->饿了
    Reactive 方式是现有事件触发,然后你就根据事件找到响应方,然后响应方处理了。

总结: 所以响应式编程就是如何编写关于怎么响应事件的编程模式,事件包括但不限于用户输入、数据流、系统状态变换。

观察者模式

观察者设计模式定义了对象间的一对多组合关系,即当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

RxJS

举例: 实现Who to follow 推荐界面

  • 启动时从api加载账户数据,并显示推荐;
  • 点击refresh,加载另外3个推荐用户;
  • 点击'x',清除当前推荐,显示新推荐;
  • 每行都显示头像和他们的主页链接;

Rx的解决方式
在Rx中,所有的东西都可以转换为一个Stream。在Rx中,官方把一个Stream称作“Observable”
1、 发送请求、收到响应、渲染响应;(使用Stream代表请求)

var requestStream = Rx.Observable.just('https://api.github.com/user');

这步就是一个包含String的Stream,没有其他操作,我们需要映射它,所以需要subscribing这个Stream。

requestStream.subscribe(function(requestUrl){
jQuery.getJSON(requestUrl,function(responseData){
    //
});
}

Rx 可以用来处理异步Data stream。那么请求的响应就也可以当作一个包含将会到达的数据的stream

requestStream.subscribe(function(requestUrl) {
    // execute the request
    var responseStream = Rx.Observable.create(function (observer) {
        jQuery.getJSON(requestUrl)
        .done(function(response) { observer.onNext(response); })
        .fail(function(jqXHR, status, error) { observer.onError(error); })
        .always(function() { observer.onCompleted(); });
    });

    responseStream.subscribe(function(response) {
        // do something with the response
    });
    }