首页 > 其他分享 >深入浅出promise、await和async以及Generator系列——promise的基本语法和使用

深入浅出promise、await和async以及Generator系列——promise的基本语法和使用

时间:2022-08-30 17:48:18浏览次数:74  
标签:resolve console log Generator await 实例 promise reject

深入浅出promise、await和async以及Generator

promise的语法

  • promise的语法是es6比较复杂的一个语法,所以请耐心看完
  • promise是面向对象思想实现的,使用的第一步需要创建一个promise实例对象
  • Promise构造函数需要接收一个回调函数(handler),该函数(handler)有两个形参resolvereject,两个形参都是一个回调函数,可以在handler里面调用resolvereject
  • 当我们调用resolve的时候,创建出来promise实例对象状态会变成成功(fulfilled)
  • 当我们调用reject的时候,创建出来promise实例对象状态会变成失败(rejected)
    // p就是创建出来的promise实例
    var p = new Promise(function(resolve, reject){
        resolve()
        // or
        reject()
    })

promise实例状态

  • promise实例状态总共有三种
    1. pending等待状态,刚创建出来的实例状态就是pending
          var p = new Promise(function(resolve, reject){
              // 没有调用resolve和reject
          })
          console.log(p) // 此时实例的状态为pending
      
    2. fulfilled成功状态,调用resolve方法之后的状态
          var p = new Promise(function(resolve, reject){
              // 调用resolve
              resolve()
          })
          console.log(p) // 此时实例的状态为fulfilled
      
    3. rejected失败状态,调用reject方法之后的状态
          var p = new Promise(function(resolve, reject){
              // 调用reject
              reject()
          })
          console.log(p) // 此时实例的状态为rejected
      
  • 注意: 一个promise实例最终有一个状态,状态一旦确定就不允许再次改变,也就是说要么成功,要么失败
         var p = new Promise(function(resolve, reject){
            // 2s调用reject
            setTimeout(() => {
                reject()
            }, 2000);
            // 3s调用resolve
            setTimeout(()=>{
                resolve()
            }, 3000)
        })
        console.log(p) // 最终实例的状态为rejected
    

promise实例的结果

  • 一个promise实例无论成功还是失败,最终都会有一个结果
  • 可以利用这个结果来返回异步的数据
  • 调用resolve方法传递的参数是成功得到的结果,称之为终值(value)
    var p = new Promise(function(resolve, reject){
        // 调用resolve
        resolve(终值)
    })
    console.log(p) // 此时实例的状态为fulfilled
  • 调用reject方法传递的参数是失败得到的结果,称之为拒因(reason)
    var p = new Promise(function(resolve, reject){
        // 调用reject
        reject(拒因)
    })
    console.log(p) // 此时实例的状态为rejected
  • 如何获取这个结果呢?这时候就需要用到promise实例的方法了

promise实例方法

  • 每一个promise实例的原型上面都有三个方法
    • then方法
    • catch方法
    • finally方法
  • then方法
    • then方法接受两个函数,一个是成功之后执行的回调函数,一个是失败之后执行的回调函数
    • 成功的回调函数接收一个参数就是终值
    • 失败的回调函数接收一个参数就是拒因
        var p = new Promise(function(resolve, reject){
            // 调用resolve
            resolve(终值)
        })
        console.log(p) // 此时实例的状态为fulfilled
        p.then((终值)=>{
            console.log('实例状态成功执行')
        }, (拒因)=>{
            console.log('实例状态失败执行')
        })
    
  • catch方法
    • catch方法只会接收一个函数,这个函数就会在失败之后执行
    • 回调函数接收一个参数就是拒因
        var p = new Promise(function(resolve, reject){
            // 调用reject
            reject(拒因)
        })
        console.log(p) // 此时实例的状态为rejected
        p.catch((拒因)=>{
            console.log('实例状态失败执行')
        })
    
  • finally方法
    • finally方法会接收一个函数,这个函数无论在成功还是失败都会调用
    • 回调函数不接受参数
        // 成功状态
        var p1 = new Promise(function(resolve, reject){
            // 调用resolve
            resolve(终值)
        })
        p1.finally(()=>{
            console.log('调用了')
        })
        // 失败状态
        var p2 = new Promise(function(resolve, reject){
            // 调用reject
            reject(拒因)
        })
        p2.finally(()=>{
            console.log('调用了')
        })
    
  • 以上就是promise的语法,我们利用promise可以实现封装ajax的案例
function ajax(type, url, data){
    return new Promise(function (resolve){
        // 1. 创建一个实例
        var xhr = new XMLHttpRequest()
        // 2. 配置请求信息
        // 判断请求方式是get还是post
        if(type === 'get'){
            xhr.open(type, url+data, true)
            // 3. 发出请求
            xhr.send()
        }else{
            xhr.open(type,url,true)
            // 设置请求头 规定前端发给后端的数据格式
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
            // 3. 发出请求
            xhr.send(data.slice(1))
        }
        // 4. 返回后端响应的数据
        xhr.onload = function(){
            resolve(xhr.responseText)
        }
        xhr.onerror = function(){
            reject(xhr)
        }
    })
}
// 使用promise的ajax
ajax(
    "get",
    "./serve/get.php",
    "?username=jack&password=123456"
).then((res)=>{
    console.log(res)
}).catch((err)=>{
    console.log(err)
})

标签:resolve,console,log,Generator,await,实例,promise,reject
From: https://www.cnblogs.com/crim/p/16640191.html

相关文章

  • js Linked List Generator All In One
    jsLinkedListGeneratorAllInOnejs链表生成器classListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(nex......
  • Promise的回顾及SPA路由实现
     Promise    return在对应的promise的函数中      在promise里面的then函数(catch函数中)return相当于调用resolve。thrownewError相当于调用re......
  • Promise的回顾及SPA路由实现
    Promisereturn在对应的promise的函数中在promise里面的then函数(catch函数中)return相当于调用resolve。thrownewError相当于调用rejectPromise.resolve('第一个值')......
  • 为什么 .NET应用推荐使用 await、async异步编程?
    前言 1、什么是async/await?await和async是.NETFramework4.5框架、C#5.0语法里面出现的技术,目的是用于简化异步编程模型。2、async和await的关系?async和await是成对......
  • 一文帮你把脉:了解自己的Promise功底(Promise笔试题)
    文本已开启银杏化模式,题目难度从简入难,非常银杏 1.1题目一constpromise1=newPromise((resolve,reject)=>{console.log('promise1')})console.log('1',p......
  • day 19 promise 和闭包
    闭包和promise闭包概述:闭包是一种书写代码一种结构,这种结构拥有的特性就是内部的空间在使用中不会被回收。(内部的变量以及对应的参数不会被gc回收)函数的预编译过程开......
  • ant-design上传组件方法beforeUpload返回false或promise.reject仍然失效
    问题描述:在使用antdesign框架的Upload上传组件时,相信很多人做过上传文件的格式、大小、数量、或其他依赖条件等的限制,这些限制一般都是需要在beforeUpload方法中进行处理......
  • Uncaught (in promise) TypeError: Failed to fetch dynamically imported module 报
    今天刚上班没多久碰到如下错误好几个菜单点击都是报这个错误,点了加载不出来,然后报错。最初开始怀疑是不是路由改到了,查询了一遍没有问题。百度了一下,有说地址写错的,不能......
  • Promise
    Promise简介Promise是JS中引入的一种新的提供异步编程的解决方案,旧的方案是使用回调函数。异步编程通常在以下情景中使用:Node.js下的fs模块的文件操作数据库操作Ajax......
  • 函数式编程与 JS 异步编程、手写 Promise
    目录函数式编程与JS异步编程、手写Promise简答题函数式编程与JS异步编程、手写Promise简答题谈谈你是如何理解JS异步编程的?EventLoop、消息队列都是做什么的?......