1,Promise简介
Promise是JS异步编程的一种解决方案,比传统的解决方案(回调函数和时间)更合理且更加强大。主要用来解决回调地狱问题,Promise是一个容器,里面存放的是将来才会结束的事件(异步请求)。
2,Promise状态
Promise共有三种状态
pending:进行中
fulfilled:已成功
reject:已失败
注:
- Promise对象的三种状态,不受外界的影响,只有Promise中存放的将来会结束的事件才会影响。
- Promise状态一旦改变,将不可逆
pending ==> fulfilled
pending ==> rejected
3,Promise对象的创建
Promise是一个构造函数,在创建对象的时候,需要传入一个回调函数,回调函数有两个参数,分别代表resolve(解决),reject(拒绝),并且都是函数。
- 当调用resolve 函数,代表Promise的状态会从Promise ==>fufilled
- 当调用reject函数,代表Promise的状态会从Promise ==>rejected
resolve 和 reject可以在设置状态的同时,可以传递一个数据(最多一个数据),给 then 和 catch。
Promise共有三种创建方式:
//最常用的创建方式
let promise = new Promise(function(resolve,reject){
})
//直接创建一个成功的Promise对象
let pro = Promise.resolve("OK");
pro.then(function(ok){
console.log(ok);//OK
})
//直接创建一个失败的Promise对象
let pro = Promise.reject("Error");
pro.catch(function(error){
console.log(error);//Error
})
4,thenable对象
thenable对象指的是对象中,有一个then对象
let obj = {
name:'zhangsan',
then:function(s){
console.log(this.name);
}
}
Promise.resolve(obj);//zhangsan
5,then和catch方法
Promise中提供了then和catch两种方法,分别用来处理 已成功 和 已失败 的状态。
- 如果Promise状态为fuifilled,则调用then方法来处理对应成功的逻辑。
- 如果Promise状态为rejected,则调用catch方法来处理对应失败的逻辑。
let promise = new Promise((resolve,reject) => {
//resolve 和 reject 不能同时出现,如果同时出现,将只会执行第一个状态。
//因此,本段代码只会执行resolve。
resolve("OK");//代表成功,执行then方法
reject("Error");//代表失败,执行catch方法
})
promise.then(function(s){
console.log("事情已被解决",s);//事情已被解决 OK
})
promise.catch(function(s){
console.log("事情没有被解决",s);//事情没有被解决 Error
})
then 和 catch 方法的参数也是一个函数,而且这个函数的返回的都是一个全新的Promise对象。
then 和 catch 在函数中可以return一个值,如果没有return,默认代表return undefiend。
- 如果return的是一个非Promise对象,那么会通过Promise.resolve()将return的值转成一个状态为fuifilled的Promise对象。
- 如果return的是一个Promise对象,则返回一个新的Promise对象,该Promise对象的状态由return的Promise的对象状态决定。
then 和 catch方法代码的执行时间:在本轮事件结束后才执行的代码。
setTimeout()代码执行时间:本轮事件结束,下轮事件开始的时候执行。
所以,then 和 catch 方法要先于setTimeout()执行。