#iOS 之 Promise简易实现

作者: 践行者 | 来源:发表于2016-06-29 11:21 被阅读1298次

iOS 之 Promise简易实现

Promises/A的API规范

1. 有限状态机

Promise 有一个有限状态机,共有三种状态:pending(执行中)、fulfilled(执行成功)和rejected(执行失败)。

其中pending为初始状态,fulfilled和rejected为结束状态(结束状态表示promise的生命周期已结束)。

状态转换关系为:pending->fulfilled,pending->rejected。

state.png

2.实例方法

Promise then([{Function} onFulfilled[, {Function} onRejected]]) , 用于订阅Promise对象状态转换事件,入参onFulfilled为执行成功的事件处理函数,入参onRejected为执行失败的事件处理函数。两 者的返回值均作为Promise对象单向链表中下一个Promise对象的状态转换事件处理函数的入参。而then方法的返回值是一个新的Promise 对象并且已添加到Promise对象单向链表的末尾。

Promise catch({Function} onRejected) ,相当于 then(null, onRejected) 。

functionV1.0.png

3.状态函数

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.png
4.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

相关文章

网友评论

  • MacLeon:好的,学习了,谢谢解答
  • MacLeon:你好,感谢分享,请问iOS中有些什么场景是必须要用到Promise的吗
    kirito_song:// 下载数据
    [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){
    ...
    });
    kirito_song:没有什么场景必须用那种设计模式。promise主要还是在多层闭包嵌套的时候、用链式编程的方式帮我们把原本嵌套在一起的block、一个一个排列起来

本文标题:#iOS 之 Promise简易实现

本文链接:https://www.haomeiwen.com/subject/hfqxjttx.html