zoukankan      html  css  js  c++  java
  • ES6系列文章 异步神器async-await

     

    关于异步处理,ES5的回调使我们陷入地狱,ES6的Promise使我们脱离魔障,终于、ES7的async-await带我们走向光明。今天就来学习一下 async-await。

     

    async-await和Promise的关系

     

    经常会看到有了 async-await、promise 还有必要学习吗async await优于promise的几个特点,接收了这些信息后,就蒙圈了。现在才知道,async-awaitpromisegenerator的语法糖。只是为了让我们书写代码时更加流畅,当然也增强了代码的可读性。简单来说:async-await 是建立在 promise机制之上的,并不能取代其地位。

     

    基本语法

     

    async function basicDemo() {
        let result = await Math.random();
        console.log(result);
    }
    
    basicDemo();
    // 0.6484863241051226
    //Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined}

     

    上述代码就是async-await的基本使用形式。有两个陌生的关键字asyncawait,同时函数执行结果似乎返回了一个promise对象。

    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);// 两秒之后会被打印出来
    console.log('--end') } awaitDemo(); // normalFunc // something, ~~ // enough sleep~
    // --end
     

    实例1

    举例说明,你有三个请求需要发生,第三个请求是依赖于第二个请求的结果第二个请求依赖于第一个请求的结果。若用 ES5实现会有3层的回调,若用Promise 实现至少需要3个then。

    一个是代码横向发展,另一个是纵向发展。今天指给出 async-await 的实现哈~

    //我们仍然使用 setTimeout 来模拟异步请求
    function sleep(second, param) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(param);
            }, second);
        })
    }
    
    async function test() {
        let result1 = await sleep(2000, 'req01');
        let result2 = await sleep(1000, 'req02' + result1);
        let result3 = await sleep(500, 'req03' + result2);
        console.log(`
            ${result3}
            ${result2}
            ${result1}
        `);
    }
    
    test();
    //req03req02req01
    //req02req01
    //req01

    实例2

    有三个异步请求需要发送,相互没有关联,只是需要当请求都结束后将界面的 loading 清除掉即可。

    async function correctDemo() {
        let p1 = sleep(1000);
        let p2 = sleep(1000);
        let p3 = sleep(1000);
        await Promise.all([p1, p2, p3]).then(function (results) {
            console.log(results) // 获得一个Array: ['P1', 'P2'] 
    })
    console.log('clear the loading~~')

    }
    correctDemo();// clear the loading~

    错误/失败 reject处理

    上述的代码好像给的都是resolve的情况,那么reject的时候我们该如何处理呢?

     

    function sleep(second) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                reject('want to sleep~');
            }, second);
        })
    }
    
    async function errorDemo() {
        let result = await sleep(1000);
        console.log(result);
    }
    errorDemo();// VM706:11 Uncaught (in promise) want to sleep~
    
    // 为了处理Promise.reject 的情况我们应该将代码块用 try catch 包裹一下
    async function errorDemoSuper() {
        try {
            let result = await sleep(1000);
            console.log(result);
        } catch (err) {
            console.log(err);
        }
    }
    
    errorDemoSuper();// want to sleep~
    // 有了 try catch 之后我们就能够拿到 Promise.reject 回来的数据了。

     

     

  • 相关阅读:
    Android 架构:Android Jetpack 架构组件的学习和分析
    Android 看源码学 Binder
    Android Okhttp 源码分析(待完成)
    Android Glide 源码分析系列(待完成)
    界面2
    使用spring 4.0 + maven 构建超简单的web项目
    maven中跳过单元测试
    Hibernate+maven+eclipse 实现自动建表
    android开发学习---开发一个简易的短信发送器
    java面试题--实现一个百亿的计算器
  • 原文地址:https://www.cnblogs.com/zhaoxiaobei/p/10635246.html
Copyright © 2011-2022 走看看