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)
)

 

 

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • select top 的用法

    select top 的用法selecttop1*from员工orderby编号select*from员工orderby编号select*from员工where编号likeYG%orderby编号descselectTOP1*from员工where编号likeYG%orderby编号desc

  • 1.7-工控上位机软件开发平台介绍

    1.7-工控上位机软件开发平台介绍一、前言前面几章一直没有提到上位机的另一个主要使用场合,即“工业上位机软件”。主要是因为本人没有接触过,不敢贸然发表见解类的文章。最近在机缘巧合下,对“工业上位机软件”有了一些初步的了解。在这里和大家分享一下。注意本节的内容还不够专业全面,只适合对“工控软件”进行一个初步的了解。二、工业“自动化”控制系统的组成在工业生产过程中,最重要的是安全,其次是稳定。工业生产环境中可以常见大如“吊车”般的设备、有毒气体、强碱、强酸、几千度的高温、易燃易爆气体、高压水蒸气。所以容不得半点错误,出错就意味着要死人,因

  • acwing-361. 观光奶牛(0/1分数规划)「建议收藏」

    acwing-361. 观光奶牛(0/1分数规划)「建议收藏」给定一张 L 个点、P 条边的有向图,每个点都有一个权值 f[i],每条边都有一个权值 t[i]。求图中的一个环,使“环上各点的权值之和”除以“环上各边的权值之和”最大。输出这个最大值。注意:数据保证至少存在一个环。输入格式第一行包含两个整数 L 和 P。接下来 L 行每行一个整数,表示 f[i]。再接下来 P 行,每行三个整数 a,b,t[i],表示点 a 和 b 之间存在一条边,边的权值为 t[i]。输出格式输出一个数表示结果,保留两位小数。数据范围2≤L≤1000,2≤P≤50

  • idea2022激活码永久jar【2022免费激活】「建议收藏」

    (idea2022激活码永久jar)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • pycharm2021激活码【注册码】

    pycharm2021激活码【注册码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 【Android】Android加密和解密方式

    【Android】Android加密和解密方式一、不可逆加密不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。如信息摘要(MessageDigest)和安全散列(SecureHash)算法属于此类,常见的算法包括MD5、SHA1、PBKDF2、bcrypt等。特点:使用MD5和SHA进行加解密://MD5加密privatestaticStringt

发表回复

您的电子邮箱地址不会被公开。

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