iOS 之 Promise简易实现
Promises/A的API规范
1. 有限状态机
Promise 有一个有限状态机,共有三种状态:pending(执行中)、fulfilled(执行成功)和rejected(执行失败)。
其中pending为初始状态,fulfilled和rejected为结束状态(结束状态表示promise的生命周期已结束)。
状态转换关系为:pending->fulfilled,pending->rejected。
state.png2.实例方法
Promise then([{Function} onFulfilled[, {Function} onRejected]]) , 用于订阅Promise对象状态转换事件,入参onFulfilled为执行成功的事件处理函数,入参onRejected为执行失败的事件处理函数。两 者的返回值均作为Promise对象单向链表中下一个Promise对象的状态转换事件处理函数的入参。而then方法的返回值是一个新的Promise 对象并且已添加到Promise对象单向链表的末尾。
Promise catch({Function} onRejected) ,相当于 then(null, onRejected) 。
functionV1.0.png3.状态函数
Promise({Function} factory/({Function} resolve, {Function} reject)/) ,构造函数存在一个Function类型的入参factory,作为唯一一个修改promise对象状态的地方,其中factory函数的入参resolve的作用是将promise对象的状态从pending转换为fulfilled,而reject的作用是将promise对象的状态从pending转换为rejected。
入参 void resolve({Any} val) , 当val为非thenable对象和promise对象时则会将val作为执行成功事件处理函数的入参,若val为thenable对象时则会执行 thenable.then方法,若val为Promise对象时则会将该Promise对象添加到Promise对象单向链表中。
入参 void reject({Any} reason) ,reason不管是哪种内容均直接作为执行失败事件处理函数的入参。
Note:关于抛异常的做法,同步模式为 throw new Error("I'm synchronous way!") ,而Promise规范的做法是 reject(new Error("I'm asynchronous way!"));
stateModifyV2.0.png4.0 Demo地址
简单的应用
screenshot.png
https://github.com/softwarefaith/JAPP-Promise-ObjC
不够完善,比较简陋
参考文章
1.阿里https://yq.aliyun.com/articles/31914
2.美团http://tech.meituan.com/promise-insight.html
3.阮一峰http://javascript.ruanyifeng.com/advanced/promise.html
3.deferhttp://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html
网友评论
[NSURLConnection sendAsynchronousRequest:rq1 queue:q completionHandler:^(id, id data1, id err) {
// 下载相关数据
[NSURLConnection sendAsynchronousRequest:rq2 queue:q completionHandler:^(id, id data2, id err) {
// 下载图片
[NSURLConnection sendAsynchronousRequest:rq3 queue:q completionHandler:^(id, id dat3a, id err) {
}];
}];
}];
用链式编程就可以写成:
[NSURLConnection promise:rq1].then(^(id data1){
return [NSURLConnection promise:rq2];
}).then(^(id data2){
return [NSURLConnection promise:rq3];
}).then(^(id data3){
...
});