promise的理解

2021-05-09  本文已影响0人  波仔_4867
    promise用来解决回调地狱的问题,把异步的代码用同步的方式来实现

    Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
    它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

    一个Promise的三种状态
    pending: 初始状态,既不是成功,也不是失败状态。
    fulfilled: 意味着操作成功完成。
    rejected: 意味着操作失败。

    Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
    Resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
    Reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

    Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。


    demo1==============================================
       let flag = true;
       function task() {
           return new Promise(function (resolve, reject) {
               //同步代码,立即执行
               console.log('执行promise回调中的代码');  
               if (flag) {
                   // 只有调用resolve时,才会执行then中的回调
                   // resovle触发的then中的回调是异步操作
                   resolve('success')
               } else {
                   // 只有调用reject时,才会执行catch中的回调
                   // reject触发的catch中的回调是异步操作
                   reject('error')
               }
           })
       }
       task()
       .then(function(msg){
           console.log(msg);
       })
       .catch(function(err){
           console.log(err);
       })
      promise.all([ajax1(),ajax2()])当ajsx1和ajax2都返回数据时触发
      .then()当ajsx1和ajax2都成功时调用的函数
       .catch()当ajsx1和ajax2任一函数失败时调用的函数
      promise.race([ajax1(),ajax2()])看谁先执行完函数时触发
       .then()当ajsx1和ajax2谁先执行完且成功是调用
       .catch()失败时调用

       asyne和await是promise的语法糖 
       asyne定义了一个异步函数,消除了promise中then的链式调用
       await 后面的同步代码
       asyne function reader(){
       try{     处理异常 如果此时有错误会被捕获
           let result=await ajax()
             task(result)
   }.catch(err){
       console.log('异常时运行的代码')          
}          
}
上一篇 下一篇

猜你喜欢

热点阅读