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变量,还避免了嵌套代码。这些小的优点会迅速累计起来,这在之后的代码示例中会更加明显

  • 相关阅读:
    JUC高并发编程(三)之模拟接口压力测试
    JUC高并发编程(二)之多线程下载支付宝对账文件
    JUC高并发编程(一)之请求合并案例
    《Head First设计模式》读书笔记
    图文详解23种设计模式
    Laravel路由匹配
    深夜debug:一个不常遇到的HbuilderX自动化测试运行问题
    高德地图API中折线polyline不能跨越180度经度线的解决方案
    sublime配置java运行环境
    Docker技术入门
  • 原文地址:https://www.cnblogs.com/xyptechnology/p/10339631.html
Copyright © 2011-2022 走看看