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详解的更多相关文章

  1. Promise和async await详解

    本文转载自Promise和async await详解 Promise 状态 pending: 初始状态, 非 fulfilled 或 rejected. fulfilled: 成功的操作. rejec ...

  2. JavaScript中的async/await详解

    1.前言 ​ async函数,也就是我们常说的async/await,是在ES2017(ES8)引入的新特性,主要目的是为了简化使用基于Promise的API时所需的语法.async和await关键字 ...

  3. C#多线程和异步(二)——Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  4. C#多线程和异步(二)——Task和async/await详解(转载)

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  5. Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  6. C#多线程和异步——Task和async/await详解

    阅读目录 一.什么是异步 二.Task介绍 1 Task创建和运行 2 Task的阻塞方法(Wait/WaitAll/WaitAny) 3 Task的延续操作(WhenAny/WhenAll/Cont ...

  7. async和await详解

     async和await详解 1.非UI线程中执行 Test()函数带有async 和await ,返回值写成Task. 1 using System; 2 using System.Threadin ...

  8. async与await详解

    async和await只是编译器功能.编译器会用Task类创建代码.如果不适用这两个关键字,也可以用C#4.0和Task类实现同样的功能,只是没有那么方便. 题主在概念上确实混淆的不行,但是确实asy ...

  9. 关于async function(){ let res = await } 详解

    本文引自: https://www.jianshu.com/p/435a8b8cc7d3 async function fn(){ //表示异步,这个函数里面有异步任务 let result = aw ...

随机推荐

  1. 解决tomcat部署项目中碰到的几个问题

    在tomcat上部署项目并进行测试,经常会碰到各种问题.在不同的操作系统上部署,对问题的解决也会有一些差异. 1 发现问题 1.1 项目部署 先将项目达成war包,放到tomcat的webapps目录 ...

  2. C#读写Excel的几种方法

    1 使用Office自带的库 前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题,从Nuget下载 Microsoft.Office.Interop.Excel 读写代 ...

  3. ArcGIS API for JavaScript 入门教程[5] 再讲数据——Map类之底图与高程

    [回顾]前4篇交代了JsAPI的背景.资源如何获取,简介了数据与视图分离的概念与实现,剖析了页面的大骨架. 这篇开始,讲Map类. 转载注明出处,博客园/CSDN/B站/知乎:秋意正寒 目录:http ...

  4. Android之Fragment详解

    文章大纲 一. 什么是Fragment二. Fragment生命周期三. Fragment简单实例四.Fragment实战五.项目源码下载六.参考文章   一. 什么是Fragment Fragmen ...

  5. andorid 应用第二次登录实现自动登录

    前置条件是所有用户相关接口都走 https,非用户相关列表类数据走 http. 步骤 第一次登陆 getUserInfo 里带有一个长效 token,该长效 token 用来判断用户是否登陆和换取短 ...

  6. redis 特性

    Redis 三大特性: Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用 Redis 不仅支持简单的 键 * 值 类型的数据,  还提供list.set.z ...

  7. MsSql去掉重复记录

    假如有这样一张表news:字段:id,title,time,image,author,现在表中有1万多条记录,其中title重复的有上千条.如何才能一次性将title重复记录删除呢? ID Title ...

  8. netdom join 错误:指定的域不存在,或无法联系。

    环境: 域控制器:feiquan.com  IP:192.168.1.132 客户端:\\win-quan IP:192.168.1.129(动态) 域控制器可以和客户端ping通,但客户端加入域时就 ...

  9. windows下gitbash安装教程

    下载安装 1.从git官网下载一个git安装包,官网下载地址http://www.git-scm.com/download/ 2.双击安装程序,进入欢迎界面点击[Next >] 3.阅读协议,点 ...

  10. Window10 输入法不能删除问题解决

    有时候我们想删除一个输入法,却发现输入法Remove 按钮是Disalbe 的,这时可以使用下面方法回避这个问题. 1.使用 Administrator 运行 Windows powerSheell. ...