Promise 是抽象的异步处理对象
语法 它本身就是一个类,也可以说是构造函数
构造函数需要一个 函数作为参数. 这个函数叫做"执行器函数".
1)执行器函数在创建Promise对象时立即执行.
2)Promise对象有状态和值
-
a.pending undefined
-
b.resolved/fulfilled ‘哈哈’ 表示成工
-
c.rejected ‘呜呜’ 表示失败
细节:状态不可逆
let p1 = new Promise((resolve(成功),reject(失败))=>{})
Promise(里面的内容叫做执行器函数)
如果想控制它什么时候执行,可以在外层用一个函数包住它.(这样使代码更加灵活更加可控)
let p1 = new Promise((resolve,reject)=>{
// console.log('执行器函数会立即执行~')
setTimeout(()=>{
console.log('a')
resolve('哈哈')
reject('呜呜')
},3000)
})
- then()方法接收两个函数作为参数,
第一个参数是 Promise 执行成功时的回调,
第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用
function p1 () {
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('a')
resolve()
},3000)
})
}
function p2() {
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('a')
resolve()
},3000)
})
}
function p3(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('a')
resolve()
},3000)
})
}
p1().then(p2).then(p3)
细节:
p1().then(p2()) //这样p2会提前调用. 注意:这里的p2不能写括号
p1().then(p2) //把p2这个函数当做参数传给then
//这里尽量不要在then()里面使用回调函数的方法
p1().then(()=>{p2()}).then(()=>{p3()})
相当于:p1().then(()=>{p2()};return undefined).then(()=>{p3()})
//这里会出现错误 p2() p3() 会同时执行
- catch()方法,它可以和 then 的第二个参数一样,用来指定 reject 的回调,另一个作用是,当执行 resolve 的回调(也就是上面 then 中的第一个参数)时,如果抛出异常了(代码出错了),那么也不会报错卡死 js,而是会进到这个 catch 方法中。
- all()方法,Promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调, 会把所有异步操作的结果放进一个数组中传给 then。
- race()方法,race 按字面解释,就是赛跑的意思。race 的用法与 all 一样,只不过 all 是等所有异步操作都执行完毕后才执行 then 回调。而 race 的话只要有一个异步操作执行完毕,就立刻执行 then 回调。
- 注意:其它没有执行完毕的异步操作仍然会继续执行,而不是停止