zoukankan      html  css  js  c++  java
  • 理解 es7 async/await

    简介

    JavaScript ES7 中的 async / await 让多个异步 promise 协同工作起来更容易。如果要按一定顺序从多个数据库或者 API 异步获取数据,你可能会以一堆乱七八糟的 promise 和回调函数而告终。而 async / await 结构让我们能用可读性强、易维护的代码更加简洁地实现这些逻辑。

    promises

    在 JavaScript 中,promise 代表非阻塞异步执行的抽象概念。

    promise 一般用于网络 和 I/O操作,比如读取文件,或创建http请求。我们可以创建异步promise,然后用then 添加一个回调函数,当promise结束后会触发这个回调函数,而非阻塞住当前的线程,回调函数本身也可以返回一个promise对象,所以我们能够用链式调用promise。

    只用一个 promise 很容易搞定。但是,当需要针对复杂异步逻辑编程时,我们很可能最后要同时用好几个 promise 对象。写一堆 then 语句和匿名回调很容易搞得难以控制。

    Async 方法

    Async 是定义返回 promise 对象函数的快捷方法。

    例如,下面这两种定义是等价的:

    function f() {
    return Promise.resolve('TEST');
    }
    // asyncF 和 f 是等价的
    async function asyncF() {
    return 'TEST';
    }

    类似地,抛出异常的 async 方法等价于返回拒绝 promise 的方法:

    function f() {
    return Promise.reject('Error');
    }
    // asyncF 和 f 是等价的
    async function asyncF() {
    throw 'Error';
    }

    Await

    只能被用在 async 方法中,让我们能同步等待 promise 执行完。如果在 async 函数外使用 promise, 我们仍然需要用 then 回调函数

    eg:

    async function f(){
    // response 就是 promise 执行成功的值
    const response = await rp('http://example.com/');
    console.log(response);
    }
    // 不能在 async 方法外面用 await
    // 需要使用 then 回调函数……
    f().then(() => console.log('Finished'));

    实际上,async / await 在底层转换成了 promise 和 then 回调函数。也就是说,这是使用 promise 的语法糖。每次我们使用 await, 解释器都创建一个 promise 对象,然后把剩下的 async 函数中的操作放到 then 回调函数中。

    错误处理

    在 promise 上使用 await 会返回值。如果我们进行 await 的 promise 失败了,async 函数就会发生异常。我们可以用标准的 try / catch 来处理这种情况

    async function f() {
    try {
    const promiseResult = await Promise.reject('Error');
    } catch (e){
    console.log(e);
    }
    }
     

    总结

    Async / await 结构是让使用 promise 更简练的语法糖。每一个 async / await 结构都可以写成普通 promise. 归根结底,这是一个编码风格和简洁的问题。

  • 相关阅读:
    ASP.NET MVC5+EF6+EasyUI 后台管理系统(28)-系统小结
    用谷歌浏览器来当手机模拟器
    解决PHP使用CVS导出Excel乱码问题
    Linux系统中关于Sqlite3中文乱码问题及解决办法
    解决excel日期变成数字的问题
    基于IE的多标签的浏览器-世界之窗2.4
    Thinkphp 获取所有子分类或父分类ID
    PhpExcel 删除默认的Sheet
    Mysql 创建表时错误:Tablespace for table `tablexx` exists. Please DISCARD the tablespace before IMPORT.
    关于ThinkPhp中getField方法存在的问题
  • 原文地址:https://www.cnblogs.com/huancheng/p/10637093.html
Copyright © 2011-2022 走看看