基于ObjC的轻量级Promise库——RWPromiseKit
来源:互联网 发布:宝软网java软件下载 编辑:程序博客网 时间:2024/06/07 23:15
起
闲来无事。在看JavaScript的时候发现Promise
这东西不错。将隐藏在异步调用中的逻辑变成了同步调用。
getJSON("/posts.json").then(function(posts) { // ... consume(posts);}).catch(function(error) { console.log('something wrong!', error);});
关于Promise
,可以看这里和这里
github上搜了一下有一个Start比较多的。大致浏览了一下,mxcl/PromiseKit主要是靠RunLoop
的实现的(也有用OperationQueue
实现的)。
实现
构思了一下,通过ARC+KVO完全可以实现promise之间依赖关系。至于链式调用,在我的另一篇文章中有介绍了,不在此赘述了。
代码放在我的github上了。欢迎拍砖。
功能
Promise
构造一个promise:
RWPromise* p1 = [RWPromise promise:^(ResolveHandler resolve, RejectHandler reject) { if (condition){ resolve(@"result"); }else{ reject(@"result"); } }];
resolve
和reject
用于改变promise的状态,由promise生成者来决定。调用resolve
或reject
可以同步或者异步。
then 和 catch
then
then
本身会返回一个新的promise。新的promise会依赖于上一个promise的状态。
当promise的状态在变成Resolved之后会调用then
传入的block。前一个promise中resolve的value会传递给then
产生的promise。then
的block中必须返回一个值,若返回值不是RWPromise
,则等价于调用reslove(value)
这里我对then做了一些改造,只传了resolved的handler。并没有传入rejected的handler。
catch
catch
本身也会返回一个新的promise。新的promise会依赖于promise链上所有promise的状态。若某个promise的状态为rejected,则会调用整个链上上的第一个catch
的promise。
看如下代码:
[RWPromise promise:^(ResolveHandler resolve, RejectHandler reject) { resolve(@"1"); }].then(^id(id value){ NSLog(value); return @"2"; }).catch(^(NSError* e){ NSLog(@"error"); }).then(^id(id value){ NSLog(value); return nil; });
最后结果为:
1
2
[RWPromise promise:^(ResolveHandler resolve, RejectHandler reject) { reject(nil); }].then(^id(id value){ NSLog(value); return @"2"; }).catch(^(NSError* e){ NSLog(@"error"); }).then(^id(id value){ NSLog(value); return nil; });
结果为:
error
nil
上面参考的链接有详细的解释,不多说了,具体参见javascript。目前支持的API:
then
catch
finally
all
race
after
timeout
reject
resolve
map
filter
reduce
- 存在的问题
只有部分Unit Test .- Block支持多参数
原作写于segmentfault 链接
0 0
- 基于ObjC的轻量级Promise库——RWPromiseKit
- JSON——基于javascript的轻量级数据交换格式
- LightRNN —— 基于RNN的轻量级语言模型
- 深入 Promise(二)——进击的 Promise
- 基于promise.js实现nodejs的promises库
- axios – 基于 Promise 的 HTTP 异步请求库
- JavaScript:Defer/Promise轻量级实现
- 深入 Promise(三)——命名 Promise
- Promise—javascript异步操作的潮流
- Nodejs的Promise库
- 资料——基于关系结构的轻量级工作流引擎(中国科学院计算机技术研究所)
- 云效平台——基于jmeter的轻量级性能测试平台
- EvaThumber : 基于URL的轻量级图片处理库
- ES6——Promise
- JS——promise
- ES6 —(Promise)
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- Android Activity中点击EditText以外的位置软键盘收起
- OGG-01820 Could not enable workspace
- nm命令与符号说明
- yaml在python上的应用
- (OK) 编译xerces-c-3.1.2(动态库)—CentOS 7— android-ndk
- 基于ObjC的轻量级Promise库——RWPromiseKit
- Console命令 来调试js
- JDBC连接Apache Drill
- Android—adb shell—/system/bin/sh: ./executer: No such file or directory
- 第五周项目2.2-游戏中的角色类
- Android 系统名字、版本、API level的对应关系
- Tizen 3.0大升级:采用Linux 4.1内核与Wayland、支持64位
- POJ 2104 K-th Number(快排 or 平方分割 or 归并树—求区间第k大数)
- 毛主席五虎将