学习 Promise (结合 Rxjava)

来源:互联网 发布:网络的英文翻译 编辑:程序博客网 时间:2024/06/01 10:31

当前的问题

在开发过程中不同的语言都有遇到 callback hell(回调地狱), 回调一般出现在异步操作中。
简单的例子:
① 从网络获取图片
② 将图片进行压缩
③ 压缩后的数据保存到本地
以上几个操作都属于异步操作,

op1(callback(){    success(){        op2(callback(){            success(){                op3(callback(){                    success(){                      // done                    }                    error(e){                    }                })              }            error(e){            }        })    }    error(e){    }})

解决方案

不同语言设计针对此都有对应的解决方案,将回调写成流水线,将复杂的操作变成一条线。

Rxjava:java 中处理异步

Promise: JavaScript 中处理异步

写起来类似于下面的代码:

op1()  .then(op2)  .then(op3)  .catch(e)  .done();

Promise 对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和 Rejected(已失败)。

创建 promise

rxjava

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {    @Override    public void call(Subscriber<? super String> subscriber) {      // ... some code      if (/* 异步操作成功 */){        subscriber.onNext(value);        subscriber.onCompleted();      } else {        subscriber.onError(error);      }});

Promise

var promise = new Promise(function(resolve, reject) {  // ... some code  if (/* 异步操作成功 */){    resolve(value);  } else {    reject(error);  }});

流水线

rxjava

observable.doOnNext()    .map    .filter    .doOnNext()    .subscribe(        public void onCompleted() {            // ....                       }        public void onError(Throwable e) {            // ...        }        public void onNext(AppInfo appInfo) {            // ...        }    );

promise

promise.then(function(){}).then(function(){}).catch(function(error){});

all

类似于 Observable ob = Observable.merge(ob1,ob2,ob3)

Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。

var p = Promise.all([p1, p2, p3]);

上面代码中,Promise.all 方法接受一个数组作为参数,p1、p2、p3 都是Promise对象的实例。(Promise.all方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例。)

p的状态由p1、p2、p3决定,分成两种情况。

(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

race

var p = Promise.race([p1,p2,p3]);

Promise.race 方法同样是将多个Promise实例,包装成一个新的Promise实例。

上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的回调函数。

finally

不管 Promise 对象最后状态如何,都会执行的操作 。

参考链接

http://es6.ruanyifeng.com/?search=fetch&x=0&y=0#docs/promise

https://mcxiaoke.gitbooks.io/rxdocs/content/operators/Merge.html

文章来自: http://hanks.xyz

0 0
原创粉丝点击