Promise--->回调地狱问题

211 阅读2分钟

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方法时传入。

附上一张图:

image.png

2.让我们来看一下 回调地狱

image.png

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.执行逻辑

image.png

它的两个参数都是函数,其执行逻辑是:
  • 如果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);