一、promise的组成

1、task:promise要完成的任务;

2、result:处理完的数据;

3、status:状态;

4、fulfill、reject(对应catch)

5、ResolveCallback ErrorCallback promise状态的解释函数

6、resolve:

对promise当前的状态作出解释,已完成的状态立即执行回掉,未完成的状态注册回掉函数;

7、then:前一promise的回掉注册,后一promise的前导;

二、promose状态机:

fulfill、reject:状态改变函数、输入;前导;可以由内部和外部函数执行;

表面接口是task;task内部可能经过多次传递;

ResolveCallback ErrorCallback :状态改变后的输出函数;后续;

三、promise的生命周期(以异步为例)

1、promiseA创建、执行异步task功能;

2、调用then创建中继promise结点(promiseZ),同时将then输入的(promiseX)构造器和promiseZ的(fulfill)打包(promiseA.resolve())传递给promiseA.resolveCallbacks[];

3、promiseA task完成,执行promiseA.fulfill,履行promiseA承若;

4、promiseA.fulfill 调用 后继函数向外传递状态;

5、resolveCallback执行,首先生成promiseX,然后将promiseZ的fulfill注册为promiseX的后继功能;

6、promiseX task完成,执行promiseX 的 fulfill,resolveCallback调用promiseZ的fulfill;

7、promiseZ的状态完成、履行承诺;调用后继的promise模块;

四、函数式编程的环境变量—模拟递归函数调用站

promise异步调用链的构建过程相当于递归调用的构建过程;

promise链的执行过程相当于递归调用的反向执行过程;

理清构造和执行的关键在于搞清楚每一个函数或block的环境变量;

尤其是block,它的环境变量可能横跨几个promise模块;

block的环境变量:

1、self函数代表的promise;

2、函数参量的输入;

3、block生成的环境变量

@discardableResult func then<U>(_ next: @escaping ((T) -> Promise<U>) ) -> Promise<U> {

return Promise<U> { fulfill, reject in

self.catch { (err) in

reject(err)

}.resolve { result in

next(result).catch { (err) in

reject(err)

}.then { (finalResult) in

fulfill(finalResult)

}

}

}

}

普通函数调用通过全局函数和函数调用栈保存环境变量;

block通过block对象保存环境变量;

四、异步编程模型

五、promoie (task)的功能

promiseA:起始的异步功能函数,异步完成后履行promise,调用后继功能;

promiseX:履行then输入的功能,作为promiseA的后继和promiseZ的前导;

由promise构造器(monand的flatmap中的transform)生成;

promiseZ:   负责将promiseX构造器和自身的fulfill打包,通过promiseA的resolve传递给promiseA;同时中继后面的promise;

promiseZ作为promise.then的环境变量;

六、promise构造函数、then、回掉函数管道化

@discardableResult func then<U>(_ next: @escaping ((T) -> Promise<U>) ) -> Promise<U> {

return Promise<U> { fulfill, reject in

self.catch { (err) in

reject(err)

}.resolve { result in

next(result).catch { (err) in

reject(err)

}.then { (finalResult) in

fulfill(finalResult)

}

}

}

}

七、promise、flatMap

trait Monad[M[_]] {

def unit[A](a: A): M[A]

def flatMap[A, B](fa: M[A])(f: A => M[B]): M[B]

将promise对象的构建看成一个过程,

只有transform: @escaping ((T) -> Promise<U>)执行完成,promiseZ才算构造完成;

异步链式编程—promise沉思录的更多相关文章

  1. jQuery插件编写及链式编程模型

    jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我 ...

  2. 由表单验证说起,关于在C#中尝试链式编程的实践

    在web开发中必不可少的会遇到表单验证的问题,为避免数据在写入到数据库时出现异常,一般比较安全的做法是前端会先做一次验证,通过后把数据提交到后端再验证一次,因为仅仅靠前端验证是不安全的,有太多的htt ...

  3. iOS 链式编程探索(Masonry)

    看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...

  4. ASP.NET MVC学前篇之扩展方法、链式编程

    ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...

  5. 原生JS实现jquery的链式编程。

    这是我根据之前遇到的一个面试题,题目:用原生JS实现$("#ct").on("click",fn).attr("id"). 然后看了篇jqu ...

  6. ios的链式编程笔记

    1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数  > 链式编程思想 2. 使用block当函数的返回参数 // 之前开发中比较习惯 ...

  7. Java链式编程接口

    在android开发中显示一个AlertDialog时,常采用下列的写法: new AlertDialog.Builder(getApplicationContext()) .setTitle(&qu ...

  8. JavaScript系列:模块化与链式编程

    模块化:闭包和和函数作用域(JS没有块级作用域ES6之前)构造模块 var man=function(){ var age=12; return { getYear:function(){ retur ...

  9. java中的链式编程

    听到链式编程听陌生的,但是写出来就感觉其实很熟悉 package test; public class Test { String name; String phone; String mail; S ...

随机推荐

  1. AngularJS 的全选、反选实现

    目录 AngularJS 的全选.反选实现 一.需求 二.思路 三.实现 AngularJS 的全选.反选实现 一.需求 要使用 AngularJS 实现 checkbox 的全选.反选. 其中所有项 ...

  2. 如何选择CPU

    一.品牌: 选择哪家公司的处理器,AMD公司和inter公司的处理器相比较,AMD在三维制作.游戏应用.和视频处理方面突出,inter的处理器在商业应用.多媒体应用.平面设计方面有优势,性能方面,同档 ...

  3. [SOJ #687]双生串(2019-11-6考试)/[hdu5431]AB String

    题目大意 把所有仅包含\(AB\)的字符串按字典序排列,给你一个仅包含\(AB\)的字符串\(S\),然后有\(Q\)个问题,第\(i\)个问题给你\(k_i\),求不是\(S\)的子串中,第\(k_ ...

  4. 【题解】分离与合体 [Loj10151]

    [题解]分离与合体 [Loj10151] 传送门:分离与合体 \([Loj10151]\) [题目描述] 给定一个长度为 \(n\) 的序列,如果从某个点 \(k\) 处将区间 \([l,r]\) 断 ...

  5. C# 多维数组 交错数组的区别,即 [ , ] 与 [ ][ ]的区别 (转载)

    多维数组的声明 在声明时,必须指定数组的长度,格式为 type [lenght ,lenght ,lengh, ... ] , ]; 或声明时即赋值,由系统推断长度 int [,] test1 = { ...

  6. ftp搭建后外网无法连接和访问阿里云服务器(非软件)

    阿里云服务器由于性价比高,是不少企业建站朋友们的首选.而在购买阿里云服务器后,不少客户反映其在搭建FTP后出现外网无法访问的问题,这里特意搜集整理了关于ftp搭建后外网无法连接和访问的问题,提供以下解 ...

  7. Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接在 ...

  8. jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jquery筛选方法

    jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jq ...

  9. 英语caement单词caement水泥

    水泥石  又称净浆硬化体.是指 硬化后的水泥浆体,称为水泥石,在英语里是cement有时写作caement [1] ,是由胶凝体.未水化的水泥颗粒内核.毛细孔等组 成的非均质体. 中文名:水泥石 外 ...

  10. Redis支持的数据类型

    String字符串: 格式: set key value string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 . string类型是Redi ...