写点什么

解决回调深渊的利器(二)

  • 2020-01-10
  • 本文字数:1807 字

    阅读完需:约 6 分钟

解决回调深渊的利器(二)

优点和缺点

优点:可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。


缺点:首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

Promise 的生命周期

每一个 Promise 都会经历一个短暂的生命周期:先是处于进行中 pending(Promise 对象的初始状态,等到任务的完成或者被拒绝)状态,此时操作未完成,所以它也是未处理的;一旦异步操作执行结束,promise 就会进入以下两种状态中的一种:Resolved 又称 fulfilled(任务执行完成并且成功的状态);Rejected(任务执行完成并且失败的状态)。


Promise 的状态只可能从 Pending 状态转到 Resolved 状态或者 Rejected 状态,而且不能逆向转换,同时 Resolved 状态和 Rejected 状态也不能相互转换。

Then()方法

所有的 Promise 都有 then()方法,且同一个 Promise 对象可以注册多个 then 方法,它接受两个可选参数:第一个是当 Promise 的状态变为 resolved 时要调用的函数;第而个是当 Promise 的状态变为 rejected 时要调用的函数。


注意事项:如果省略这两个参数,或者提供非函数,那么将创建一个没有其他处理程序的新 Promise,只是采用 Promise 的最终状态,then 被调用。


如果省略第一个参数或提供的不是函数,创建的新 Promise 简单地采用 Promise 的完成状态,then 被调用(如果它变为完成)。


如果省略第二个参数或提供的不是函数,创建的新 Promise 简单地采用 Promise 的拒绝状态,then 被调用(如果它被拒绝)。



Then 方法返回的是一个新的 promise 对象,因此可以采用链式写法;


下面这个例子使用 then 方法依次指定了两个回调函数,第一个函数执行完,执行第二个回调函数,实现依次打印 1,2,3


catch() 方法

Promise 还有一个 catch() 方法,相当于只给其传入拒绝处理程序的 then() 方法。Promise.catch() 方法是 .then(null, rejection) 的别名,用于指定发生错误时的回调函数。



上面代码中,promise 抛出一个错误,就被 catch() 方法指定的回调函数捕获。


一般总是建议,Promise 对象后面要跟 catch() 方法,这样可以处理 Promise 内部发生的错误。Catch() 方法返回的还是一个 Promise 对象,因此后面还可以接着调用 then() 方法。

将其他对象变为 Promise 对象

Promise.resovle() 和 Promise.reject() 方法,可以将不是 Promise 对象作为参数,返回一个 Promise 对象。不同的是 Promise.resovle() 返回的是完成态的 Promise,Promise.reject() 创建已拒绝的 Promise。


Promise.resovle() 和 Promise.reject() 方法都可以接受非 Promise 的 thenable 对象作为参数。如果传入一个非 Promise 的 Thenable 对象,返回的 promise 会“跟随”这个 thenable 的对象,采用它的最终状态;否则以该值为成功状态返回 promise 对象;


有两种情形:


1.假设传入的参数没有一个 .then 方法,那么这个返回的 Promise 对象变成了 resolve 状态,其 resolve 的值就是这个对象本身。


2.假设传入的参数带有一个 then 方法(称为 thenable 对象),那么将这个对象的类型变为 Promise,其 then 方法变成 Promise.prototype.then 方法。


响应多个 Promise

Promise 有一个"静态方法"——Promise.all(注意并非是 promise.prototype),这个方法接受一个元素是 Promise 对象的数组。这个方法也返回一个 Promise 对象,如果数组中所有的 Promise 对象都 resolve 了,那么这些 resolve 的值将作为一个数组作为 Promise.al()l 这个方法的返回值的(Promise 对象)的 resolve 值,之后可以被 then 方法处理。如果数组中任意的 Promise 被 reject,那么该 reject 的值就是 Promise.al()l 方法的返回值的 reject 值。then 方法的第一个回调函数接收的 resolve 值(如上所述,是一个数组)的顺序和 Promise.all 中参数数组的顺序一致,而不是按时间顺序排序。


还有一个和 Promise.all() 相类似的方法 Promise.race(),它同样接收一个数组,只不过它只接受第一个被 resolve 的值。


Promise 的兴起,解决了在异步方法调用中,会出现回调函数一环扣一环的情况。不仅代码写起来美观,而且问题复杂的时候,阅读代码的人也容易以理解。


本文转载自 Think 体验设计公众号。


原文链接:https://mp.weixin.qq.com/s/oZ-VCAXsboTx5cph4oAMVw


2020-01-10 11:51708

评论

发布
暂无评论
发现更多内容

时序数据库 TDengine 签约新奥新智

TDengine

数据库 tdengine 时序数据库

接口自动化测试不想写代码?这款工具强烈推荐

不想敲代码

自动化测试 API 自动化测试平台

DTT年度收官圆桌π,华为云8位技术专家的年末盘点

华为云开发者联盟

云计算 后端 华为云 12 月 PK 榜

零信任与 K8s 环境实践

HummerCloud

k8s 零信任 kubernetes 运维

艺多不压身!华为云CDN成众多企业网络支撑

路过的憨憨

重磅!XTransfer荣登InfoQ【十大开发者最向往的高价值技术团队】榜单

XTransfer技术

Apache APISIX 3.1.0 版本正式发布

API7.ai 技术团队

开源 api 网关 APISIX apache 社区

NFTScan 与 Cwallet 团队达成战略合作伙伴,由 NFTScan 为其提供 NFT API 数据服务

NFT Research

NFT 数据基础设施

如何正确使用网格设置制作卡片类型展示页面

Towify

理解iOS端的WebView同层组件

珲少

云网络运维必备神器:全链路故障诊断与分析

华为云开发者联盟

云计算 后端 华为云 12 月 PK 榜

行云管家荣膺STIF第三届国际科创节 “2022年度数字化创新典范奖”

行云管家

信息安全 数字化 国际科创节

确保网路畅通,华为云CDN加速服务大有可为

路过的憨憨

跳板攻击原理及如何追踪定位攻击者主机(下)

郑州埃文科技

IP地址 跳板攻击 攻击溯源

Liga妙谈 | 找准「话事人」,高效甄别和响应用户反馈

LigaAI

产品经理 敏捷开发 PO 产品负责人 12 月 PK 榜

使用 SQL 实现同比环比分析

搞大屏的小北

数据可视化 同比环比 展示同比环比 BI大屏同比环比

这个API管理工具不登录不下载就能用!

不想敲代码

API 接口管理 协同办公 协同软件

数益工联 x TiDB丨如何运用 HTAP 挖掘工业数据价值?

TiDB 社区干货传送门

着眼全局提升决策质量,华为云大数据BI让企业看见未来

爱尚科技

一文讲清「敏捷路线图」| Liga译文

LigaAI

Scrum 产品经理 敏捷开发 软件开发 12 月 PK 榜

1024·致敬 | 迟到的小温暖,感谢不平凡的你们

XTransfer技术

YMatrix 番外篇|透过镜头,那些不为人知的故事

YMatrix 超融合数据库

车联网 超融合数据库 C++ YMatrix 研发故事

工业数据分析为什么要用FusionInsight MRS IoTDB?

华为云开发者联盟

大数据 后端 华为云 工业数据 12 月 PK 榜

等保四级适用于哪些领域?一年一次吗?

行云管家

等保 等级保护 等保四级

ROMA Connect: 5大联接能力+4大集成能力,推进企业数字化转型

华为云开发者联盟

云计算 后端 数字化 华为云 12 月 PK 榜

如何在等待页面制作加载动画

Towify

捷报频传 | Bonree ONE获2022科技赋能金融业场景金融建设突出贡献奖

博睿数据

可观测性 智能运维 博睿数据 ONE平台 荣誉奖项

智能制造 | AIRIOT智慧工厂管理解决方案

AIRIOT

物联网 智慧工厂 物联网系统搭建

网络拥堵影响业绩?看华为云CDN如何为企业保驾护航

路过的憨憨

助力企业服务体验升级,华为云CDN这样做

路过的憨憨

墨芯人工智能加入龙蜥,携手打造软硬协同稀疏化计算平台

OpenAnolis小助手

人工智能 开源 龙蜥社区 CLA 墨芯

解决回调深渊的利器(二)_文化 & 方法_Think体验设计_InfoQ精选文章