Promise的用法,文章后有面试题

Promise

then方法:

指定用于得到promise成功的回调或失败的回调,并且将返回一个新的promise对象

  • 成功的状态:执行then方法的第一个回调函数

  • 失败的状态:执行then方法的第二个回调函数

<script>
        const p1 = new Promise((resolve,reject)=>{
            resolve('ok')
        })
        p1.then(value=>{
            //成功执行
            console.log(value);
        },reason=>{
            //失败执行
           console.log(reason);
        })
</script>
  • then方法的返回的Promise实例化对象取决于回调函数中的内容

  • 如果返回的是非promise对象,则得到的是一个成功的promise对象

  • 如果返回的是promise对象,则这个promise对象的状态将直接影响then方法返回的那个promise的状态和结果

  • 如果为抛出异常,则then方法返回的promise对象为失败的promise

<script>
      const p1 = new Promise((resolve, reject) => {
        resolve('ok')
        // reject("error");
      });
        const result =  p1.then(
        (value) => {
          return new Promise((resolve,reject)=>{
            resolve('success')
            //   console.log(value);
          })
        },
        (reason) => {
          console.log(reason);
        }
      );
      console.log(result); //结果为成功的promise对象结果值为success
    </script>
promise.all ()

用户判断多个promise的状态,需要传一个数组,当所有promise的状态都是成功的,promise.all返回的promise对象才是成功的,有一个为失败就为失败

  <script>
      const p1 = new Promise((resolve, reject) => {
        resolve('ok')
      });
      const p2 = new Promise((resolve, reject) => {
        resolve('ok')
      });
      const p3 = new Promise((resolve, reject) => {
        reject('error')
      });
      const result = Promise.all([p1,p2,p3])
      console.log(result); //失败的promise
      
    </script>
promise.allSettled()

用来确定一组promise异步操作是否都结束了(不管成功还是失败),包含fulfilled和rejected两种情况

<script>
      function ajax(url){
        return new Promise((resolve,reject)=>{
            let xhr = new XMLHttpRequest()
            xhr.open('get',url,true)
            xhr.send()
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){  
                    if(xhr.status >= 200 &&xhr.status<300){
                        resolve(xhr.responseText)
                    }else{
                        reject(xhr.responseText)
                    }
                }
            }
        })
      }
    Promise.allSettled([
        ajax('http://127.0.0.1:8000/user'),
        ajax('http://127.0.0.1:8000/home')
      ]).then(value=>{
        console.log(value); 
      }).catch(reason=>{
        console.log(reason);
      })
    </script>
promise.any()

用来检验多个promise的状态,只要参数中有一个promise为成功的状态,则promise.any返回的就为成功的状态,若有多个成功的promise,则返回第一个成功的promise的结果

  <script>
      const p1 = new Promise((resolve, reject) => {
        resolve('ok')
      });
      const p2 = new Promise((resolve, reject) => {
        resolve('okk')
      });
      const p3 = new Promise((resolve, reject) => {
        reject('error')
      });
      const result = Promise.any([p1,p2,p3])
      console.log(result); //成功的promise 结果为ok
      
    </script>
promise.race()

判断多个promise实例化对象 哪个最先由pedding变为fulfilled或reject就以哪个对象的状态和结果为准

 <script>
        const p1 = new Promise((resolve, reject) => {
            setTimeout(()=>{
                resolve('ok')
            },1000)
      });
      const p2 = new Promise((resolve, reject) => {
        setTimeout(()=>{
                resolve('ok')
            },1000)
      });
      const p3 = new Promise((resolve, reject) => {
        reject('error')
      });
      const result = Promise.race([p1,p2,p3])
      console.log(result); //p3的结果
    </script>
promise.reject()

返回一个失败的promise对象,结果值为参数值

<script>
      const p1 = Promise.reject(
        new Promise((resolve, reject) => {
          resolve("ok");
        })
      );
      console.log(p1);//失败的promise
    </script>
promise.resolve()
  • 将一个普通的值转化成promise类型的数据

  • 当resolve方法参数为非promise对象,会返回一个成功的promise对象

  • 当resolve方法参数为promise对象,则这个promise对象的状态和结果将直接影响到返回的promise对象的状态和结果

catch方法
  • catch方法回调函数中没有返回值,则返回一个成功的promise对象,结果值为undefined

  • catch方法回调函数中有返回值但不是promise对象,则返回一个成功的promise对象,结果值为返回值

  • catch方法回调函数中有返回值且为promise对象,则返回值的对象直接影响catch方法返回的promise对象

 <script>
      const p1 = new Promise((resolve,reject)=>{
        reject('error')
      })
     const result = p1.catch(value=>{
        console.log(11);
      })
       //异常穿透
      p1.then(value=>{
        return value
      }).then(value=>{
        return value
      }).catch(reason=>{
        console.log(reason);
      })
      console.log(result);
​
    </script>
promise.finally()

不管promise对象的状态是成功还是失败,都会执行finally,finally没有参数

<script>
      const p1 = new Promise((resolve,reject)=>{
        reject('error')
      })
    p1.then(value=>{
      console.log(value);
​
    }).catch(reason=>{
      console.log(reason);
​
    }).finally(()=>{
      console.log(111); //都会执行finalyy
    })
​
    </script>
终止promise链条

返回一个为pending状态的promise对象

 <script>
      const p1 = new Promise((resolve,reject)=>{
        resolve('ok')
      })
    p1.then(value=>{
      console.log(value);
    }).then(value=>{
      console.log(111);
    }).then(value=>{
      console.log(222); 
      return new Promise(()=>{})  //终止 下面的then方法和catch方法要根据这个then方法的成功和失败进行执行,但是为pending状态  所以后面不再执行
    }).then(value=>{
      console.log(333);
    }).catch(reason=>{
      console.log(reason);
    })
    </script>

async函数

任何函数都可以声明成一个async函数,因为要实现异步的功能,可能要将实现的功能封装到一个函数之中,为了更好的表示函数之中是异步,所以在函数前面加一个async

函数内部可以添加任意语句来执行,但是其真正的目的是为了得到一个promise对象的状态及结果值

<script>
      async function main(){
        //情况1 返回一个非promise对象 函数调用的结果是一个成功的promise对象且值为返回值
        // return 100
​
        //情况2 返回一个promise对象 函数调用的结果的promise对象的状态和值与这个挂钩
        return new Promise((resolve,reject)=>{
          resolve('ok')
        })
​
        //情况3  抛异常
        throw new Error('faile')
      }
      let result = main()
      console.log(result);
    </script><script>
      async function main(){
        //情况1 返回一个非promise对象 函数调用的结果是一个成功的promise对象且值为返回值
        // return 100
​
        //情况2 返回一个promise对象 函数调用的结果的promise对象的状态和值与这个挂钩
        return new Promise((resolve,reject)=>{
          resolve('ok')
        })
​
        //情况3  抛异常
        throw new Error('faile')
      }
      let result = main()
      console.log(result);
    </script>
await函数
  • async函数中不一定结合await

  • await必须写在async函数中

  • await相当于then,可以拿到promise对象成功的值

  • await后面为非promise对象,后面是什么返回什么

  • await后面是promise对象,且状态为成功,则返回成功的结果值,不会返回失败的结果值,需要失败的结果值要需要try-catch

同步代码和异步代码同时出现,先执行同步,在执行异步
<script>
    //三个都为同步 ,函数里有异步任务
      async function main() {
        console.log(1111);
        let result = await Promise.resolve("ok");
        console.log(result);
        console.log(222);
        let result1 = await Promise.resolve("okkk");
        console.log(result1);
      }
​
      async function demo() {
        console.log(555);
        console.log(666);
        let result = await Promise.resolve("success");
        console.log(result);
      }
      console.log(777);
      main(); //7   1  5  6  ok  2 success ok1
      demo();
    </script>
宏任务和微任务

宏队列:用来保存执行的宏任务(回调),比如:定时器,dom事件,ajax

微队列:用来保存执行的微任务(回调),比如:promise,multation

JS执行的时候会区分两个队列

  • 首先js会必须把所有同步任务执行完

  • 每次准备取出第一个宏任务的执行之前,都需要把所有的微任务一个一个取出来执行

  • 顺序:同--微---宏

<script>
      setTimeout(()=>{
        console.log(11);
      },1000)   //异步宏任务
      new Promise((resolve,reject)=>{
        resolve('ok')
        console.log(33);  //同步任务
      }).then(value=>{
        console.log(value); //异步promise 微任务
      })
      console.log(222); //同步任务   3  2  ok  1
    </script>

面试题

   setTimeout(()=>{
        console.log(11);
      },0)   //异步宏任务
      new Promise((resolve,reject)=>{
        console.log(33);
        resolve('ok')
          //同步任务
      }).then(value=>{
        console.log(44); //异步promise 微任务
      })
      console.log(222); //同步任务   3  2  4  1
<script>
        const first = () =>(new Promise((resolve,reject)=>{
          console.log(3);//同
          let p = new Promise((resolve,reject)=>{
            console.log(7); //同
            setTimeout(()=>{  
              console.log(5);  //宏
              resolve(6)
            },0)
            resolve(1)
          })
          resolve(2)
          p.then(value=>{  //微
            console.log(value);
          })
        }))
        first().then(value=>{ // 微
          console.log(value);
        })
        console.log(4); //同
      //3  7  4  1  2  5
    </script>
 <script>
      setTimeout(()=>{
        console.log(0);  //宏
      },0)
      new Promise((resolve,reject)=>{
        console.log(1);  //同
        resolve()
      }).then(()=>{  //微
        console.log(2);
        new Promise((resolve,reject)=>{
          console.log(3); //微里面的同
          resolve()
        }).then(()=>{
          console.log(4);
        }).then(()=>{
          console.log(5);
        })
      }).then(()=>{  //微
        console.log(6);
      })
​
      new Promise((resolve,reject)=>{
        console.log(7);//同
        resolve()
      }).then(()=>{  //微
        console.log(8);
      })
      //1 7 2 3  8   4  6  5 0
    </script>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值