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

2020 年 1 月 10 日

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

Javascript 有很多强大的功能,其中一个就是它可以轻松的搞定异步编程。Node.js 用回调函数代替了事件,使异步编程在 js 领域更加流行。但当更多的程序开始使用异步编程时,事件和回调函数却不能满足开发者想要做的所有事情,而 Promise 就是这些问题的解决方案。


Promise


Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。所谓 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。


多么强大的东西都有浏览器兼容性的问题:



优点和缺点


优点:可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,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



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


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


2020 年 1 月 10 日 11:51156

评论

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

如何构建一个通用的垂直爬虫平台?

Kaito

Python 爬虫 代理

队列实现栈的3种方法,全都击败了100%的用户!

王磊

Java 算法和数据结构

为什么 React Hooks 优于 HOCs(译)

西贝

Java 翻译 React Hooks HOC

Redis还可以做哪些事?

Java旅途

redis

接口测试(apipost、jmeter和python脚本)

测试人生路

Python 接口测试 测试工具

TCP/IP 基础知识总结

cxuan

后端 计算机网络 计算机

给打工人熬一锅「毒」鸡汤

HPioneer

程序员 打工人 毒鸡汤

网络直播打赏背后的套路:刺激用户不理智消费

石头IT视角

从零实现一个动态表单设计(编辑)器

徐小夕

Java 编辑器 H5 Node React

目标检测学习-比赛路线

Dreamer

老板下了死命令,要把日志系统切换到Logback

沉默王二

Java logback 日志系统

【架构师训练营 1 期】第六周作业

诺乐

元模型驱动(二)构建元模型ーGME构建分层模型

KaYa

DDD Kaya MDA GME MDD

java安全编码指南之:文件和共享目录的安全性

程序那些事

代码规范 java安全 java安全编码指南 java编码 程序那些事

训练营第二周课程总结

爱码士

训练营

5G应用的实时决策

VoltDB

5G 物联网 工业互联网 技术分享

1分钟教你如何整理 React 知识体系

Leo

学习 前端 React 前端进阶训练营

Scrapy 源码剖析(三)Scrapy有哪些核心组件?

Kaito

Python 爬虫 Scrapy 源码剖析

Scrapy 源码剖析(四)Scrapy如何完成抓取任务?

Kaito

Python 爬虫 Scrapy 源码剖析

元模型驱动(一)构建元模型ーGME入门

KaYa

DDD Kaya MDA GME MDD

进“大厂”的故事

北风

职业规划 职业成长 大厂

【架构师训练营 1 期】第六周学习总结

诺乐

【面经】面试官:讲讲类的加载、链接和初始化?

冰河

架构 JVM 类加载 优化 性能调试

面试官:讲一下缓存穿透、缓存雪崩和缓存击穿?

bigsai

redis 缓存穿透 缓存击穿 缓存雪崩

基于服务设计的线上展览

京东智联云开发者

云安全

如何搭建一个爬虫代理服务?

Kaito

爬虫 代理

Scrapy源码剖析(一)架构概览

Kaito

Python 爬虫 Scrapy 源码剖析

轻量型GPU应用首选 京东智联云推出NVIDIA vGPU实例

京东智联云开发者

人工智能 gpu

Scrapy 源码剖析(二)Scrapy是如何运行起来的?

Kaito

Python 爬虫 Scrapy 源码剖析

训练营第二周作业

爱码士

酷睿i5-10600KF对标锐龙7 3700X,游戏表现领先且售价更香

intel001

解决回调深渊的利器(一)-InfoQ