携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天, 点击查看活动详情。
Promise
- 抽象表达: Promise 是 JS 中进行异步编程的 新解决方案 (旧方案是单纯使用回调函数)
- 具体表达:从语法上来说,Promise 是一个构造函数。 从功能上来说,Promise 对象用来封装一个异步操作,并且可以获取其 成功/失败 的结果值
异步编程:
- fs 文件操作
require("fs").readFile('./index.html', (err, data) => {})
、数据库操作、 - AJAX
axios.get('/server', (data) => {})
- setTimeout定时器
setTimeout(() => {}, timeout);
旧方案:指定回调函数,必须在启动异步任务前指定。
Promise:启动异步任务 => 返回Promise 对象 => 给Promise 对象绑定回调函数。
为什么用Promise? 指定回调函数的方式更加灵活。 支持链式调用,可以解决回调地狱问题。
- 回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件
- 回调地狱缺点:不便于阅读、不便于异常处理
- 回调地狱解决方案:Promise链式调用
Promise API
1、Promise 构造函数 : Promise(executor) {} executor函数:执行器 (resolve, reject) = {} executor 会在 Promise 内部立即同步调用,异步操作在执行器中执行
2、Promise.prototype.then 方法:(onResolve, onRejected) => {} onResolve 函数:成功的回调函数 (value) => {} onReject 函数:失败的回调函数 (reject) => {} 指定用于得到成功 value 的成功回调和用于得到失败 reason 的失败回调,返回一个新的 promise 对象
3、Promise.prototype.catch() 方法: (onReject) => {} onReject 函数:失败的回调函数 (reason) => {} then() 的语法糖,获取失败的结果
4、Promise.resolve 方法:(value) => {} value: 成功的数据或 Promise 对象 返回一个成功 / 失败的 Promise 对象
如果传入的参数为 非Promise 类型的对象,则返回的结果为成功 Promise 对象 如果传入的参数为 Promise对象,则参数的结果决定了 resolve 的结果
5、Promise.reject 方法: (reason) => {} reason:失败的原因 返回一个失败的 Promise 对象
6、Promise.all 方法:(promises) => {} promises:包含 n 个 promise的数组 返回一个新的 promise,只要有一个失败就直接失败
7、Promise.race 方法:(promises) => {} promises: 包含 n 个 promise 的数组 返回一个新的 promise,第一个完成的 promise 的结果状态就是最终的结果状态。
let p1 = new Promise((res, rej) => {
res("成功");
});
let p2 = new Promise((res, rej) => {
rej("err");
});
let p3 = new Promise((res, rej) => {
res("love");
});
const result = Promise.race([p1, p3, p2]);
/**
* Promise {<pending>}
* [[Prototype]]: Promise
* [[PromiseState]]: "fulfilled"
* [[PromiseResult]]: "成功"
* /
// const result = Promise.race([p2, p1, p3])
/**
*Promise {<pending>}
*[[Prototype]]: Promise
*[[PromiseState]]: "rejected"
*[[PromiseResult]]: "err
*/
console.log(result);
Promise的状态改变
promise共有三种状态 【PromiseState】: pending(初始)状态、resolve / fullfied (执行成功)状态、reject(执行失败)状态
promise状态转换:pending 初始状态。 变为 resolve; pending 变为 reject。
改变状态只有两种:且一个Promise 对象只能改变一次状态。
Promise 对象中的另一个属性 Promise对象的值 【PromiseResult】 保存着异步任务【成功 / 失败】的结果 resolve,reject