zoukankan      html  css  js  c++  java
  • ES6 async 函数

    async

    async 是 ES7 才有的与异步操作有关的关键字,和 Promise , Generator 有很大关联的。

    语法

    async function name([param[, param[, ... param]]]) { statements }
    • name: 函数名称。
    • param: 要传递给函数的参数的名称。
    • statements: 函数体语句。

    返回值

    async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。

    async function helloAsync(){
        return "helloAsync";
      }
      
    console.log(helloAsync())  // Promise {<resolved>: "helloAsync"}
     
    helloAsync().then(v=>{
       console.log(v);         // helloAsync
    })

    async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。

    await 关键字仅在 async function 中有效。如果在 async function 函数体外使用 await ,你只会得到一个语法错误。

    function testAwait(){
       return new Promise((resolve) => {
           setTimeout(function(){
              console.log("testAwait");
              resolve();
           }, 1000);
       });
    }
     
    async function helloAsync(){
       await testAwait();
       console.log("helloAsync");
     }
    helloAsync();
    // testAwait
    // helloAsync

    await

    await 操作符用于等待一个 Promise 对象, 它只能在异步函数 async function 内部使用。

    返回值

    返回 Promise 对象的处理结果。如果等待的不是 Promise 对象,则返回该值本身。

    如果一个 Promise 被传递给一个 await 操作符,await 将等待 Promise 正常处理完成并返回其处理结果。

    function testAwait (x) {
      return new Promise(resolve => {
        setTimeout(() => {
          resolve(x);
        }, 2000);
      });
    }
     
    async function helloAsync() {
      var x = await testAwait ("hello world");
      console.log(x); 
    }
    helloAsync ();
    // hello world

    正常情况下,await 命令后面是一个 Promise 对象,它也可以跟其他值,如字符串,布尔值,数值以及普通函数。

    function testAwait(){
        setTimeout(() => {
           console.log("testAwait");
        }, 2000);
    
    }
    async function helloAsync(){
       await testAwait();
       console.log("helloAsync");
    }
    helloAsync();
    // helloAsync
    // testAwait

    await针对所跟不同表达式的处理方式:

    • Promise 对象:await 会暂停执行,等待 Promise 对象 resolve,然后恢复 async 函数的执行并返回解析值。
    • 非 Promise 对象:直接返回对应的值。

    与Promise的区别

    1. Promise的出现解决了传统callback函数导致的“地域回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。

    2. async await与Promise一样,是非阻塞的。

    3.  async函数就相当于自执行的Generator函数。遵循的是Generator 函数的语法糖。它不能用于普通的回调函数。async必须以一个Promise对象开始 ,所以async通常是和Promise结合使用的。直接将参数从then里取出来,相比promise的链式调用,传参更加方便,异步顺序更加清晰。

    async必须以一个Promise对象开始 ,所以async通常是和Promise结合使用的。直接将参数从then里取出来,相比promise的链式调用,传参更加方便,异步顺序更加清晰。

  • 相关阅读:
    受脑认知和神经科学启发的人工智能
    1分钟爱上管理学
    刻意练习
    课题设计相关
    销售必备心灵鸡汤(转)
    从优秀到卓越
    小记
    何谓成熟?
    三体运动的程序模拟
    行星运动轨迹的程序实现
  • 原文地址:https://www.cnblogs.com/liangtao999/p/11729344.html
Copyright © 2011-2022 走看看