深入理解js promise chain


Posted in Javascript onMay 05, 2016

新的标准里增加了原生的Promise。

这里只讨论链式使用的情况,思考一下其中的细节部分。

一,关于 then() 和 catch() 的复习

then() 和 catch() 的参数里可以放置 callback 函数用来接收一个 Promise的最终结果。

then() 可以接收一个参数,那么这个 callback 只会在 Promise resolve() 的时候被调用。

then() 还可以接收第二个参数,那么第二个 callback 用来处理 Promise reject() 的情况。

catch() 专门处理 Promise reject() 的情况。

也就是说,then() 可以兼用,catch() 只能处理 reject() 的情况。不过,推荐 使用 then() 处理 resolve(),catch() 处理 reject()。

二,不过,我要讲的不是上面的东西,以上只是复习一下基本用法。这里开始讲 then() 和 catch() 的返回值和链式用法的细节。

那么官方文档说,then() 和 catch() 都返回一个 Promise ,这个说法就很耐人寻味了。(我是js新手,以前的在野的 promise 我没有接触过)。

首先,这个新返回的 Promise 不是原来的 Promise;

第二,这个新返回的 Promise 的状态的变化(是resolve()了;还是reject()了。)跟上一个 Promise 的状态 和 then() 的使用方式有关。

先说明 then() 的情况:(catch 类似)

var p1 = Promise.resolve("Success");
var p2 = p1.then(task1);
var p3 = p2.then(task2);

注:上面的task1 和 task2 都是callback。

这里,p1是一个创建出来的 Promise,并且直接 resolve()了;

p2是用then() 得到的一个 Promise, p3也是用then()得到的一个 Promise。

那么p2的状态如何改变呢,p3呢?

我准备用下图来讲解这个概念:

 深入理解js promise chain

其中,

1. 八边形代表一个Promise对象。

2. 圆形代表一个Promise内部的状态,黑色箭头代表状态变化。

3. 向右的箭头代表调用 then 函数。

4. 也就是说,只要调用 then 函数就会生成一个新的 Promise 对象。

5. 在调用 then 函数的时候,不知道前面一个 Promise 对象的状态是什么,是 pending 还是 settled?这个无法假设,在外界看不见。

6. then 函数的调用是不会阻塞的,也就是说,几乎是瞬间 p2 和 p3 就是生成了,即使 p1 还在缓慢的迁移它自身的状态。

 

我们知道,p1的状态是被 resolve了 (见上面的代码)。不过,这里还没有说明白 p2 和 p3 的状态是如何变化的,是 resolve 了还是 reject 了?看下面这个新图。

深入理解js promise chain

可以看到多了菱形。

菱形代表 调用 then 时,传入的 callback 函数。向上的菱形代表传入了【针对 上一个 Promise 对象 被 resolve 了的】处理,向下的菱形代表传入了【针对上一个 Promise 对象 被 reject 的】处理。

注意:本例中没有传入 针对 reject 的处理,也就是说,上图中不该画出向下的菱形,这里为了方便画出了,只用知道向上向下的菱形跟我们具体如何使用 then 或者 catch 有关。再看一下示例代码:

var p1 = Promise.resolve("Success");var p2 = p1.then(task1);//产生了向上的菱形var p3 = p2.then(task2);//产生了向上的菱形

可以看出,then 的 第二个参数我们没有给出,也就是我们没有处理 reject 的情况。

补充一句,如果想要处理 reject 可以使用 then ,也可以使用 catch,catch专门用来处理 reject ,除此之外,和 then 没有区别。

1. 如果 p1 的最终状态(resolve 或者 reject)被正确处理(调用 then 时,传入了对应的 callback,也就是有对应的菱形)了,那么 p2 的状态就会转为 resolve。

2. 如果 p1 的最终状态(resolve 或者 reject)没有被正确处理(调用 then 时, 缺少了对应的 callback,也就是没有对应的菱形),那么 p1 的状态就会路由到 p2(接收 p1 的状态).

3. 如此传递下去。

4. 本文不讲解,如何在 callback 中取得上一个 Promise 最终数据,也就是说,数据如何传递,这个有很多教程了。

三,下面给出一些例子来总结本文。

深入理解js promise chain

图中 P1的状态是给定的,resolve或者reject,都是自己给定的。目的是推出 P2 和 P3 的最终状态。

以上是四个独立的例子,之间没有联系。

X代表P3没有使用 then 或者 catch 函数,也就谈不到 针对 resolve或者reject 的处理了。

最后,若有错误,请及时指正,多谢!~!!@~~~

以上这篇深入理解js promise chain就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
选择TreeView控件的树状数据节点的JS方法(jquery)
Feb 06 Javascript
网页广告中JS代码的信息监听示例
Apr 02 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
May 11 Javascript
超链接的禁用属性Disabled使用示例
Jul 31 Javascript
使用AngularJS处理单选框和复选框的简单方法
Jun 19 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
Oct 08 Javascript
浅谈JavaScript中变量和函数声明的提升
Aug 09 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
Oct 31 Javascript
js实现自动轮换选项卡
Jan 13 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
Jan 21 Javascript
JavaScript使用表单元素验证表单的示例代码
Aug 20 Javascript
vue商城中商品“筛选器”功能的实现代码
Jul 01 Javascript
详解JavaScript中基于原型prototype的继承特性
May 05 #Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
May 05 #Javascript
javaScript中的原型解析【推荐】
May 05 #Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
May 05 #Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
May 05 #Javascript
详解Backbone.js框架中的模型Model与其集合collection
May 05 #Javascript
基于jQuery实现动态搜索显示功能
May 05 #Javascript
You might like
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
用jquery来定位
2007/02/20 Javascript
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
2015/12/02 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
Vue中的Vux配置指南
2017/12/08 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
工商技校毕业生自荐信
2013/11/15 职场文书
自荐信范文
2013/12/10 职场文书
大学生职业生涯规划书范文
2014/01/04 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
校园绿化美化方案
2014/06/08 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS
python和anaconda的区别
2022/05/06 Python
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers