更好地认识「Promise」
Oct 21, 2021
关于
Promise相关的使用,语言尽量通俗易懂,减少废话,如果想了解更深层次,去看隔壁看的博客/文档,或许会更好
这篇博客将是一个合集开始,会持续以 通俗易懂 减少废话 的形式,来简述 Promise 的 基本用法,如果想更 深层 地研究 Promise,那么我的博客将不适合你阅览。
Promise
首先要明白:前端向 服务器发送请求 会干嘛?
显然会 得到响应
那么:得到响应是 需要一定的时间
明白之后,在「怎么做」部分就能更好的理解
Promise 是什么
- 解决异步编程的一种方案:
异步 => 同步,比传统的回调函数和事件更合理 - 原先于
1976 年,由 Daniel P.Friedman 和 David Wise 提出Promise 思想 - 前端结合 Promise 和 JS,制定了 Promise/A+ 规范
ES6将其写进了语言标准
为什么要用 Promise
- 因为好用啊,哪还有为什么?
- 因为之前解决异步的方法
不够规范、回调地狱、很难进行错误处理
怎么做
具体看 MDN 或 阮一峰 的博客
我这里做一个 面向现实编程,跟着我的思路,你就能看懂
PS:更深的原理,请看 MDN
动手:「红绿灯」
- 我们做一个交通信号灯,排除停电,信号灯
始终只处于3种状态其中之一:红灯、绿灯、黄灯;那再简单点,把黄灯排除掉,现在还有哪些灯?自己用幼儿园数学算算! - 那我们就实现这个信号灯:
- 因为我们需要判断信号灯处于哪个状态,由于只有两种状态:
非绿即红,那我们声明一个变量isGreenLight判断是否为绿灯,默认为true(绿灯) - 因为 Promise 是一个构造函数,那我们首先需要
new一个Promise,里面执行一个函数,该函数有两个参数,分别为resolve (等待 => 成功)和reject (等待 => 失败) - 接着判断红绿灯的状态,如果为绿灯,那么返回
resolve绿灯,否则返回reject红灯 - 调用
promise,先设置成功的返回结果,就是.then然后传入一个函数,这个函数接受一个参数,这个参数就是前面resolve保留的参数 - 再
.catch,里面也传入一个函数,函数同样接受一个参数,这个参数就是前面reject保留的参数 - 最后
.finally传入一个函数,返回最终的结果(我们这里要研究的最终结果是promise 执行了)
1 | let isGreenLight = true |
ajax 请求
还有另外一种写法:.then(success, fail)
也可以不用 .catch,直接 .then(传入的第一个函数是成功函数,第二个函数是失败函数)\
我们来执行 AJAX 请求 (假设已经 new 了 Promise)
1 | ajax('get'. '/xxx') |
小结
- 第一步
return new Promise((resolve, reject) => { ... })- 成功则调用
resolve(result) - 失败则调用
reject(error) resolve和reject会再去调用成功和失败函数
- 第二步
- 使用
.then(success, fail)传入成功和失败函数
- 使用
- Stop!
- 还有其他更高级的用法,可能新手会觉得这个
Promise会不好理解,这时候需要停止研究,请先熟悉它!
- 还有其他更高级的用法,可能新手会觉得这个
优点
统一异步 API- 支持
链式调用,解决回调地狱 - 更好的
错误处理
缺点
- 无法取消
- 处于
Pending时,无法得知当时是在哪个阶段
如何解决缺点
- 别用,咋想的
如果你很 硬核 想研究 Promise 源码,那么请 点击这里
注:但这不是给新手看的,我没看,我不敢看
感谢阅读,下次见 :)
cd ../