1、Promise为何而生?
一幅回调地狱的图片足以解释

2、Promise是什么?
- Promise对象是一个构造函数,用来生成Promise实例
- Promise有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败),至于是哪一种由异步操作结果决定
3、Promise的基本用法
- Promise的构造函数接收一个函数作为参数,并且这个函数需要传入两个参数:
- resolve :异步操作执行成功后的回调函数
- reject:异步操作执行失败后的回调函数
- then方法接受两个函数作为参数,第一个函数是用来处理resolve的结果,第二个是可选的,用来处理reject的结果。
- catch函数用来捕获整个then函数链中的异常
- finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。
let p = new Promise((resolve, reject) => {
setTimeout(() => {
Math.random()*10 > 5 ? resolve('success') : reject('fail');
}, 2000)
})
p.then((data) => { //
console.log(data) //success
}, (err) => {
console.log(err) //fail
})
.catch((err) => {
console.log(err);
})
4、Promise的API
- Promise.all(),接受一个数组作为参数,数组的每一项是一个Promise实例
- 只要有一个Promise的状态变为reject,Promise.all就变为reject,只有当数组里的Promise实例状态都变为resolve时,Promise.all状态才变为resolve
let p1 = new Promise((resolve, reject) => {})
let p2 = new Promise((resolve, reject) => {})
let p3 = new Promise((resolve, reject) => {})
let p4 = Promise.all([p1, p2, p3])
p4.then((data) => {
// 三个都成功则成功
}, (err) => {
// 只要有一个失败,就判定为失败
})
- Promise.race(),接受一个数组作为参数,数组的每一项是一个Promise实例
- 与Promise.all相反, 只要有一个Promise状态变为resolve, Promise.all状态就变为resolve
let p1 = new Promise((resolve, reject) => {})
let p2 = new Promise((resolve, reject) => {})
let p3 = new Promise((resolve, reject) => {})
let p4 = Promise.all([p1, p2, p3])
p4.then((data) => {
// 只要有一个成功,就判定为成功
}, (err) => {
// 只有都失败才判定为失败
})
- Promise.resolve(),将一个值转为Promise对象并返回
- Promise.resolve方法的参数分成三种情况
- 参数是一个Promise 实例,则不做任何修改、原封不动地返回这个实例
- 参数是一个thenable对象(指具有then方法的对象)
//Promise.resolve方法会将thenable对象转为 Promise 对象,然后就立即执行thenable对象的then方法
let thenable = {
then: (resolve, reject) => {
resolve(1);
}
}
let p = Promise.resolve(thenable);
// 上面这一行等价于
// let p = new Promise(resolve => resolve(thenable))
p.then((data) => {
console.log(data) // 1
})
- 参数是普通的值类型
//Promise.resolve方法自动返回一个新的 Promise 对象,状态为resolved。
let p = Promise.resolve('Hello')
p.then((data) => {
console.log(data)
})
- Promise.reject(),跟Promise.resolve类似也会返回Promise对象,但是该对象的状态为rejected
let p = Promise.reject('err');
// 上面这一行等价于
// let p = new Promise((resolve, reject) => reject('err'))
p.then(null, (err) => {
console.log(err) //err
})
根据promiseA+实现一个自己的promise
以后再写