异步链式编程—promise沉思录
一、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沉思录的更多相关文章
- jQuery插件编写及链式编程模型
jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我 ...
- 由表单验证说起,关于在C#中尝试链式编程的实践
在web开发中必不可少的会遇到表单验证的问题,为避免数据在写入到数据库时出现异常,一般比较安全的做法是前端会先做一次验证,通过后把数据提交到后端再验证一次,因为仅仅靠前端验证是不安全的,有太多的htt ...
- iOS 链式编程探索(Masonry)
看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
- 原生JS实现jquery的链式编程。
这是我根据之前遇到的一个面试题,题目:用原生JS实现$("#ct").on("click",fn).attr("id"). 然后看了篇jqu ...
- ios的链式编程笔记
1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数 > 链式编程思想 2. 使用block当函数的返回参数 // 之前开发中比较习惯 ...
- Java链式编程接口
在android开发中显示一个AlertDialog时,常采用下列的写法: new AlertDialog.Builder(getApplicationContext()) .setTitle(&qu ...
- JavaScript系列:模块化与链式编程
模块化:闭包和和函数作用域(JS没有块级作用域ES6之前)构造模块 var man=function(){ var age=12; return { getYear:function(){ retur ...
- java中的链式编程
听到链式编程听陌生的,但是写出来就感觉其实很熟悉 package test; public class Test { String name; String phone; String mail; S ...
随机推荐
- element-ui时间选择器--设置禁止选择的时间
场景需求:开始日期不能小于今天,在今天之前的日期禁止选择,结束日期不能小于开始日期,开始日期之前的日期禁止选择. 效果图: element-ui的时间选择器中,有一个picker-options的属性 ...
- 在 flutter 上使用 c 代码 - (一) 有源码的项目
在 flutter 的 1.10.x 后的分支, dart:ffi 被并入 flutter, 现在 flutter 中也可以使用 ffi 了. 这东西是啥玩意呢, 就是让 dart 可以直接调用 c/ ...
- 『2019Summer Algorithms』
一个暑假两次集训,感觉学了好多好多的东西,也挖了好多好多的坑,于是就决定写一篇关于算法的总结,用于熟悉新算法,也留下一点对新算法的理解. AC自动机 简单的说就是在\(trie\)树上实现\(KMP\ ...
- Java分布式唯一ID生成方案——比UUID效率更高的生成id工具类
package com.xinyartech.erp.core.util; import java.lang.management.ManagementFactory; import java.net ...
- Navicat 破解版(操作非常简单)
Navicat 破解版(操作非常简单) 参考这位老哥的博客,之前试过好多个,只有这个是最简单有效的 https://blog.csdn.net/WYpersist/article/details/86 ...
- windows查看某个端口被哪个进程占用
找出端口对应的PID netstat -ano | findstr 8080 帮助命令netstat -? -a 显示所有连接和侦听端口. -n 以数字形式显示地址和端口号. -o 显示拥有的与每个连 ...
- 英语kutnahorite金田黄kutnahorite单词
金田黄是含镁和锰较多的方解石,学名是“镁锰方解石”或者“镁菱锰矿”,英文名为Kutnahorite,也可翻译为“锰白云石”.“金田黄”颜色艳丽,有红色.橙色或者黄色等不同色调,属于艳色方解石的集合体. ...
- 手表WACCHE单词WACCHE腕表
中文名:手表 外文名:watch,wacche 佩戴部位:手腕 拼音:shǒu biǎo 含义 1.戴在手腕上的小型计时器. 茅盾<夏夜一点钟>:“‘哼哼,这家伙!骗人的!’--她本能地校 ...
- Jnetpcap简述
Jnetpcap简述 最近需要做一个本地网络流量分析的项目,基于 Java 语言,上网查了很多资料,最后利用 Jnetpcap 实现了,这里做个记录. 这里先列一下我用到的工具以及版本: Eclips ...
- 在页面获取本地电脑IP
<%@ page language="java" import="java.util.*" contentType="text/html; ch ...