async await详解

作者: zhongmeizhi | 来源:发表于2019-04-01 09:59 被阅读0次

async await本身就是promise + generator的语法糖。

本文主要讲述以下内容

  1. async awiat 实质
  2. async await 主要特性

async await 实质

下面使用 promise + generate 实现 async await

    // 转换目标 async1
    // async function async1() {
    //    console.log('async1 start');
    //    await async2();
    //    console.log('async1 end');
    // }

    function async1() {
        // 将 async 转换成 *,将 awiat 转换成 yield
        var awaitInstance = (function* () {
            console.log('async1 start');
            yield async2();
            console.log('async1 end');
        })()

        // 自动执行 await 及后续代码
        // 简单起见,不处理异常情况
        function step() {
            var next = awaitInstance.next();
            // 使用Promise获取 异步/同步 方法的结果,再执行下一步
            Promise.resolve(next.value).then(function (val) {
                if (!next.done) step();
            })
        }
        step();

        // 返回Promise
        return Promise.resolve(undefined);
    }

async await 特性

  1. async 一定会返回 promise
    // 案例1: 不设置return
    async function fn() {}
    fn().then(alert); // alert -> undefined

    // 案例2:return非promise
    async function f() {
        return 1
    }
    f().then(alert); // alert -> 1

    // 案例3: return Promise
    async function fn() {
        return Promise.resolve(2);
    }
    fn().then(alert); // alert -> 2
  1. async 中代码是直接执行的(同步任务)
    console.log(1);

    async function fn() {
        console.log(2);
        await console.log(3)
        console.log(4)
     }
    fn();

    console.log(5);

    // 打印 1 2 3 5 4
    // 为何后面是 3 5 4 ? 往下看
  1. await是直接执行的,而await后面的代码是 microtask。
    async function async1() {
        console.log('async1 start');
        await async2();
        console.log('async1 end');
    }

    // 类似于
    async function async1() {
        console.log('async1 start');
        Promise.resolve(async2()).then(() => {
            console.log('async1 end');
        })
    }
  1. await后面代码会等await内部代码全部完成后再执行
    async function async1() {
        console.log('async1 start');
        await async2();
        console.log('async1 end');
    }

    async function async2() {
        return new Promise(function(resolve) {
            setTimeout(function() {
                console.log('sleep 2s');
                resolve('do');
            }, 2000)
        })
    }

    async1();

    // 打印结果
    // async1 start -> sleep 2s -> async1 end
  1. await 操作符用于等待一个Promise 对象。它只能在异步函数 async function 中使用。参考 MDN
    附:
    在chrome版本 73.0.3683.86(64 位)中,
    await是可以直接使用的。

    var x = await console.log(1)

End

持续更新中 来Github 点颗⭐吧

相关文章

  • async和await

    浅谈Async/Await用 async/await 来处理异步 async和await async:声明一个异步...

  • async await详解

    async await本身就是promise + generator的语法糖。 本文主要讲述以下内容 async ...

  • ES8(一) —— async&await

    目录 async和普通函数的区别 await async/await处理多回调异步 async和await必须配合...

  • async

    async/await特点 async/await更加语义化,async是“异步”的简写,async functi...

  • ES6中的好东西

    1 Await/Async 前端的回调时代我没有赶上,我赶上的是await/async时代。await和async...

  • Vue接口调用方式(三)async/await用法

    async/await用法 1. async/await的基本用法 async/await是ES7引入的新语法,可...

  • nodejs async 使用简介

    async await node async 使用

  • JS 中的 async/await

    async/await 是什么? async/await 是 ES2017 中新增的异步解决方案; await 只...

  • ES2017 async 函数

    async 和 await 在干什么 每个名称都有意义async : 异步await: async wait简...

  • async/await

    async/await async/await 是Generator的语法糖。 Generator 通过将Gene...

网友评论

    本文标题:async await详解

    本文链接:https://www.haomeiwen.com/subject/wismbqtx.html