zoukankan      html  css  js  c++  java
  • 用 async/await 来处理异步,async/await和Promise的区别

    Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?async-awaitpromisegenerator的语法糖。只是为了让我们书写代码时更加流畅,当然也增强了代码的可读性。简单来说:async-await 是建立在 promise机制之上的,并不能取代其地位下面一起来看看:Async/Await替代Promise的6个理由

    什么是Async/Await?

    • async/await是写异步代码的新方式,以前的方法有回调函数和Promise。
    • async/await是基于Promise实现的,它不能用于普通的回调函数。
    • async/await与Promise一样,是非阻塞的。
    • async/await使得异步代码看起来像同步代码,这正是它的魔力所在

    async

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

    async function demo01() {
        return 123;
    }
    
    demo01().then(val => {
        console.log(val);// 123
    });
    async 定义的函数有返回值,return 123;相当于Promise.resolve(123),没有声明式的 return则相当于执行了Promise.resolve();

    await

    await 可以理解为是 async wait 的简写。await 必须出现在 async 函数内部,不能单独使用。

    function notAsyncFunc() {
        await Math.random();
    }
    notAsyncFunc();//Uncaught SyntaxError: Unexpected identifier

    await 后面可以跟任何的JS 表达式。虽然说 await 可以等很多类型的东西,但是它最主要的意图是用来等待 Promise 对象的状态被 resolved。如果await的是 promise对象会造成异步函数停止执行并且等待 promise 的解决,如果等的是正常的表达式则立即执行。

    function sleep(second) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(' enough sleep~');
            }, second);
        })
    }
    function normalFunc() {
        console.log('normalFunc');
    }
    async function awaitDemo() {
        await normalFunc();
        console.log('something, ~~');
        let result = await sleep(2000);
        console.log(result);// 两秒之后会被打印出来
    }
    awaitDemo();
    // normalFunc
    // VM4036:13 something, ~~
    // VM4036:15  enough sleep~

    接收回调用法区别:

    1 function request() {
    2     return new Promise((resolve, reject) => {
    3         var xhr = new XMLHttpRequest()
    4         xhr.open ("POST", url, true)
    5         xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
    6         xhr.onreadystatechange = function(){resolve({a:1})}
    7         xhr.send({})
    8     })
    9 }

    Promise用法:

    1 request().then(function(respond){
    2     console.log(respond);
    3 })

    Async/Await用法:

    console.log(await request());

    区别: 函数前面多了一个aync关键字。await关键字只能用在aync定义的函数内。async函数会隐式地返回一个promise,该promise的reosolve值就是函数return的值.使用Async/Await明显节约了不少代码。我们不需要写.then,不需要写匿名函数处理Promise的resolve值,也不需要定义多余的data变量,还避免了嵌套代码。这些小的优点会迅速累计起来,这在之后的代码示例中会更加明显

  • 相关阅读:
    Linux IO接口 监控 (iostat)
    linux 防火墙 命令
    _CommandPtr 添加参数 0xC0000005: Access violation writing location 0xcccccccc 错误
    Visual Studio自动关闭
    Linux vsftpd 安装 配置
    linux 挂载外部存储设备 (mount)
    myeclipse 9.0 激活 for win7 redhat mac 亲测
    英文操作系统 Myeclipse Console 乱码问题
    Linux 基本操作命令
    linux 查看系统相关 命令
  • 原文地址:https://www.cnblogs.com/xyptechnology/p/10339631.html
Copyright © 2011-2022 走看看