Promise--整体说明:
它是一个ES6提出一个新语法,用来优化异步代码的写法。
- 在
前端领域是我们必须要会的一个内容
1. Promise:三种状态和值
初始态 pending
创建Promise对象时,且没有调用resolve或者是reject方法,相当于是初始状态。
var p = new Promise((resolve,rejectok,err)=>{ console.info('终会相遇' )})
console.dir(p)
成功态 resolved
也叫:fulfilled
resolved。表示解决了,就是说这个承诺实现了。 要实现从pending到resolved的转变,需要在 创建Promise对象时,在函数体中调用了resolve方法(即第一个参数)。
var p = new Promise((resolve,reject)=>{ resolved();})
console.dir(p)
失败态 rejected
rejected。拒绝,失败。表示这个承诺没有做到,失败了。要实现从pending到rejected的转换,只需要 在创建Promise对象时,调用reject函数。
var p = new Promise((resolve,reject)=>{ reject()} )
console.dir(p)
**三种状态小结:
01.状态是可转化
最初创建promise对象时,默认状态是pending,如果在函数体内部调用了第一个参数对应的函数,则状态变成了resolved;如果调用了第二个参数对应的函数,则状态变成了rejected。
pending ----- resolve() --> resolved;
pending ----- reject() --> rejected;
02. 状态转换是不可逆的。
一旦从pending ---> resolved(或者是rejected),就不可能再回到pending,也不能由resolved变成 rejected。
03.promise的值
一个promise对象除了状态之外,还有promiseValue。在构造器中,这个值在调用resolve和reject方法时传入。
附上一张图:
2.让我们来看一下 回调地狱
3. Promise的基本使用
Promise是承诺的意思,es6中提出一个新api。
用来优化异步代码。它的经典使用方式如下:
var p1 = new Promise(function(resolve,reject){
//异步操作 resolve(obj1) 或者 reject(obj2) });
p1.then(function(rs){
// 如果p1的状态是resolved,则then中的函数
//会执行,且obj1的值会传给rs
}).catch(function(rs){
// 如果p1的状态是reject,则catch中的函数
// 会执行,且obj2的值会传给rs
}).finally(function(){
// 一定会执行的函数
})
4.执行逻辑
它的两个参数都是函数,其执行逻辑是:
- 如果promise对象的状态是resolved,则then()会执行
第一个函数,并传入当前的PromiseValue(即上面的val1); - 如果promise对象的状态是rejected,则then()会执行
第二个函数,并传入当前的PromiseValue(即上面的val2); - 特别地,如果promise对象的状态是rejected,且此时then方法并没有设置第二个参数,就会向外抛出一个错误,错误的提示大约是
Uncaught (in promise)。
拓展:小小一道面试题
题目:
function sleep(time){
// 请写出你的代码
}
sleep(2000).then(()=>{
console.log("后续操作")
})
console.log(2);
答案:
function sleep(time){
// 请写出你的代码
return new Promise(resolved,rejected){
setInterval(()=>{
resolve()
},time)
}
}
sleep(2000).then(()=>{
console.log("后续操作")
})
console.log(2);