zoukankan      html  css  js  c++  java
  • Async和await

    异步操作是 JavaScript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。从最早的回调函数,到 Promise 对象,再到 Generator 函数,每次都有所改进,但又让人觉得不彻底。它们都有额外的复杂性,都需要理解抽象的底层运行机制。异步I/O不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用关心它是不是异步。async 函数就是隧道尽头的亮光,很多人认为它是异步操作的终极解决方案。--阮老师的博客
    

    基本规则

    • async 表示这是一个async函数,await只能用在这个函数里面。

    • await 表示在这里等待promise返回结果了,再继续执行。

    • await 后面跟着的应该是一个promise对象(当然,其他返回值也没关系,只是会立即执行,不过那样就没有意义了…)

    function waitAMinute(time) {
    return new Promise(resolve=>{
    setTimeout(()=>{
    resolve(20)
    }, time)
    })

    async function test() {
    console.log('hello world')
    console.log(await waitAMinute(2000)) //两秒钟后输出20
    console.log('welcome')
    }

    test(); //hello world , 20, welcome

    获取返回结果

    • await等待的虽然是promise对象,但不必写.then(..),直接可以得到返回值,会直接获取resolve的执行结果

    let start = function() {
    return new Promise(resolve=>{
    setTimeout(()=>{
    resolve('HelloWorld')
    })
    })
    }

    let end = async function() {
    let result = await start()
    console.log(result) //获取结果HelloWorld
    }
    end()

    异常处理

    既然then不必写了,那么.catch()也不需要写了,直接将await代码放入try/catch异常处理块儿当中

    let end = async function() {
    try {
    let result = await start()
    console.log(result)
    } catch(error) {
    throw new Error(err.message)
    }
    }

    注意

    1. ***await 关键字只能用在async function内部,否则会报错
    2. ***这里所说的一步函数内部表示必须在改异步函数的执行上下文中才可以

    [...].forEach(function(value,index){
    console.log('当前是第'+ index +'次调用')
    var result = await start() //报错
    })

  • 相关阅读:
    百度地图生成器添加标注不显示
    为web文件夹添加IIS应用程序池用户权限
    SSL证书 .pem转.pfx
    sql获取表的所有字段及属性
    sql server不用安装sql管理工具开启sa
    asp.net mvc+webuploader大文件分片上传
    将WinForm程序(含多个非托管Dll)合并成一个exe的方法
    手机访问网站自动跳转到手机版
    c++和cuda混合编程 实现传统神经网络
    leetcode 338
  • 原文地址:https://www.cnblogs.com/chihaiping/p/6978207.html
Copyright © 2011-2022 走看看