#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