【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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

  • 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:51560

评论

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

Qunar 酒店 NodeJS 覆盖率收集实践

Qunar技术沙龙

大前端 nodejs Node JavaScrip

DevOps如何攻克研发流程六大痛点?

BoCloud博云

在华为P50 Pro中,听到AI异构通信的朱弦三叹

脑极体

Flutter 与 Swift - 在创建 iOS 应用程序时应该押注什么技术?

iOSer

flutter swift ios开发

记一次10人跨组织、跨地域的开源协作经历

腾源会

开源 腾讯 腾讯开源

深度解读鸿蒙轻内核CPU占用率

华为云开发者联盟

鸿蒙 cpu 任务 CPUP LiteO

Activiti数据库表结构

金陵老街

云原生的能源数据管理平台方案|EMQ 映云科技&华为云联合直播内容回顾

EMQ映云科技

华为云 能源 Cloud 碳中和 emq

Go 让 Apache APISIX 如虎添翼

API7.ai 技术团队

Apache 开源 插件 APISIX Go 语言

“性能混合架构”了解了吗?英特尔Alder Lake惊艳来袭

科技新消息

替换及重置Homebrew默认源以及M1安装

一个大红包

8月日更

NodeJs深入浅出之旅:模块🌀

空城机

大前端 Node 8月日更

鲲鹏基础软件开发赛道openLooKeng赛题火热报名中,数十万大奖等您来收割

华为云开发者联盟

鲲鹏 openLooKeng

万物皆为向量:在线向量召回工程服务化实践

爱奇艺技术产品团队

深度学习 推荐 向量

基于java springboot vue活动报名系统源码(毕设)

清风

Java springboot elementUI 毕业设计

从头到尾没有一句废话!阿里Redis神级手册,从基础到源码

Java redis 编程 面试 阿里

进化十多年,四足机器人的网红属性有改变吗?

脑极体

聊聊 Kafka: 在 Linux 环境上搭建 Kafka

编程susu

Java IT 计算机 编程开发 技术宅

使用 GitHub Issues 来写博客,真香。

彭宏豪95

GitHub 写作 博客

超赞!GitHub上百万下载量Java面试手册!颠覆你的认知

Java~~~

Java 架构 面试 网络 架构师

2021年8月数据库流行度排行:数据库道路漫漫其修远兮,为用户创造核心价值是正道

墨天轮

数据库 TiDB oceanbase 国产数据库 达梦

如何在Android 8.0以下高效地复用图片?

爱奇艺技术产品团队

android 开发 图片存储

一周信创舆情观察(8.9~8.15)

统小信uos

赋能数据中心绿色低碳 浪潮云洲有实招

浪潮云

云计算

浅谈云上攻防——Kubelet访问控制机制与提权方法研究

腾讯安全云鼎实验室

k8s 云安全

GitHub再现神作,阿里大牛面试30家大厂,整合出这份Java面试手册

Java~~~

Java 架构 面试 JVM 架构师

图解:为什么非公平锁的性能更高?

Java 程序员 面试 后端 计算机

千字真言,字字珠玑,我的Golang学习笔记,赤诚分享

奔着腾讯去

Go 语言

牛掰!“基础-中级-高级”Java程序员面试集结,看完献出我的膝盖

Java 编程 面试 IT 计算机

全靠这份阿里大佬的“Java进阶面试手册”收获蚂蚁offer

Java~~~

Java 架构 面试 算法 JVM

凭借一份“面试真经pdf”,我四面字节跳动,拿下1-2级offer

Java 程序员 面试 后端 计算机

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