学习 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
- 学习 Promise (结合 Rxjava)
- RxJava与Retrofit结合学习
- RxJava结合源码学习一
- RxJava结合源码学习二
- RxJava 学习笔记(八) --- Combining 结合操作
- Android框架学习之Retrofit(二)RxJava和Retrofit2.0的结合使用
- Retrofit+Rxjava结合使用(三)
- Promise学习记录(一)
- ES6学习11(Promise)
- Promise学习笔记(一)
- 学习Promise
- promise学习
- promise学习
- RxJava学习之结合(组合)型操作符
- Rxjava学习之结合操作符—zip
- RxJava学习(一),RxJava初识
- RxJava 学习(一)
- RxJava学习(二)
- 开源镜像站最新动态20150626
- Python 小练习 倒序切片
- Servlet 注册01
- Leetcode-maximum-depth-of-binary-tree
- Eclipse插件springsource-tool-suite的下载和安装
- 学习 Promise (结合 Rxjava)
- Leetcode-reverse-integer
- Two Cylinders (辛普森公式处理积分)
- 二叉树的遍历。。。
- BZOJ 2208: [Jsoi2010]连通数
- 4. gpio 库
- Android Studio NDK调试(基于gradle-experimental插件与LLDB)
- jquery 基础
- Linux内核模块编译