ES6之async与await

ES6之async与await

· async – await 是 Promise 和 Generator 的语法糖,目的只是为了让我们书写代码时更加流畅,增强代码的可读性。

· async – await 是建立在Promise机制之上的,并不能取代其地位

基本语法:

async function demo01() {
  let result = await Math.random()
  console.log(result)  
}

demo01()   //  输出一个随机数

async:

  async用来表示函数是异步的,定义的函数会返回一个Promise对象,可以使用then方法添加回调函数

async function demo02() {
  return '返回结果'  
}

demo02().then(res => console.log(res)) // 输出: 返回结果(若 async 定义的函数有返回值,相当于Promise.resolve('返回结果'))

 

await:await必须出现在 async 函数内部,不能单独使用。

  ·await后面可以跟任何js表达式。它最主要的意图是用来等待 Promise 对象的状态被 resolved。

  ·如果await的是 Promise 对象会造成异步函数 停止 执行并且 等待 Promise的解决,如果等的是正常的表达式则立即执行

  使用方法

function sleep(second) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('enough sleep~')
    }, second)
  })
}

async function dome03() {
  await () => {console.log('表达式立即执行')}
  let result = await sleep(2000)
  console.log(result)  //需要等待 sleep 函数执行完成 resolve 才输出(2000毫秒后输出:enough sleep~)       
}

 

  实例1(模拟当一个请求需要依赖上一个请求返回的参数时,async与await的使用实例):

// 模拟异步请求
function sleep(second, param) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(param);
        }, second);
    })
}

async function test() {
    let result1 = await sleep(2000, 'req01')
    // 等待第一个 await 执行完成
    let result2 = await sleep(1000, 'req02' + result1)
    // 等待第二个await 执行完成
    let result3 = await sleep(500, 'req03' + result2)
    // 等待所有的await执行完成
    console.log(`${result3} --- ${result2} --- ${result1}`)
}

test()  // 等待所有的 await 执行完成输出:req01 --- req02req01 --- req03req02req01

 

  实例2(当需要异步发送多个请求且请求都是独立时的实例):

function sleep(second) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('request done! ' + Math.random());
        }, second);
    })
}

// 正确写法
async function correctDemo() {
    let p1 = sleep(1000);
    let p2 = sleep(1000);
    let p3 = sleep(1000);
    // Promise.all('一个可迭代的对象') 将多个 Promise 实例,包装成一个新的 Promise 实例,一次性处理n个Promise对象。
    await Promise.all([p1, p2, p3]);
    console.log('clear the loading~');
}

// 错误写法:以下写法不能实现同步请求,必须等待第一个await接收到sleep的解决才会执行第二个await
async function bugDemo() {
    await sleep(1000)
    await sleep(1000)
    await sleep(1000)
    console.log('clear the loading~')
}

correctDemo()
bugDemo()

 

错误处理:

  处理错误

function sleep(second) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('want to sleep~');
        }, second);
    })
}

async function errorDemoSuper() {
    try {
        let result = await sleep(1000);
        console.log(result);
    } catch (err) {
        console.log(err); // 当await等待的结果为reject时执行
    }
}

errorDemoSuper() // 输出:want to sleep~

  捕捉错误:  

// 定义个抛出异常的方法
function errorTest(second) {
    throw new Error('抛出一个异常!!!')
}

 

  方式1:通过 try … catch捕获

try {
  errorTest()
}catch(error){
  console.log(error)  
}

  方式2: 在then回调中捕获

errorTest().then(
 resolve => console.log(resolve),
 error => console.log(error)   
)

  方式3:在Promise的catch中捕获

errorTest().catch(
  error => console.log(error)
)

 

 

想要逃避总有借口,想要成功总有方法!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2591.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java cas原理_java cas原理

    Java cas原理_java cas原理CASCAS:CompareandSwap,翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。 本文先从CAS的应用说起,再深入原理解析。CAS应用CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。非阻塞算

    2022年10月16日
    4
  • 2021idea激活码 JB account(最新序列号破解)

    2021idea激活码 JB account(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    969
  • 关于height:100%和height:100vh的区别

    关于height:100%和height:100vh的区别关于height:100%和height:100vh的区别vh就是当前屏幕可见高度的1%,也就是说height:100vh==height:100%;但是当元素没有内容时候,设置height:100%,该元素不会被撑开,此时高度为0,但是设置height:100vh,该元素会被撑开屏幕高度一致。…

    2022年4月28日
    81
  • 什么是pisa测试_PISA测试很专业,但对理解什么是教育很重要

    什么是pisa测试_PISA测试很专业,但对理解什么是教育很重要原标题:PISA测试很专业,但对理解什么是教育很重要PISA是一项比IMO(奥数)规模更大、样本更全、参考价值更高的各国学生学习能力测试,可以准确观察国家国基础教育存在的问题。一什么是PISA测试?度娘:PISA(ProgramforInternationalStudentAssessment)(国际学生评估项目)是由联合国经济合作与发展组织(OrganizationforEconomi…

    2022年5月3日
    66
  • 解决微信小程序errcode:40029[通俗易懂]

    解决微信小程序errcode:40029[通俗易懂]第一次接触微信小程序,喜提errcode:40029errmsg:”invalidcode,hints:[req_id:6HfBbZyFe-8y]场景:写完接口之后前端联调一直500,最后发现是获取的时候微信报错了。解决办法:导入项目的时候appid要填入你请求session_key的appid,如图所示(我这个开发者工具是旧版的)还有一种解决方法是其他文章找…

    2022年5月24日
    357
  • faster-rcnn原理介绍

    faster-rcnn原理介绍本博客大部分参考http://blog.csdn.net/zy1034092330/article/details/62044941,其中夹杂着自己看论文的理解效果图作者提到目标检测,就不得不RBG大神,该大神在读博士的时候就因为dpm获得过pascalvoc的终身成就奖。博士后期间更是不断发力,RCNN和Fast-RCNN,Faster-Rcnn就是他的典型作品。前言讲起faster-rcnn

    2022年10月4日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号