1. async和await最关键的用途是以同步的写法实现了异步调用,是对Generator异步方法的简化和改进。使用Generator实现异步的缺点如下:

  • 得有一个任务执行器来自动调用next()
  • yield命令后面只能是 Thunk 函数或 Promise 对象,Thunk函数只接受一个参数,然后返回一个把回调函数作为参数的函数(很绕,不直观)

2.函数前使用async修饰符时不管函数内出不出错都会返回一个Promise对象;

3.返回的Promise对象是由谁决定的?

  • 如果函数体内的语句没有错误,则会返回一个fulfilled状态的Promise,否则返回一个rejected状态的Promise
  • 如果有await语句,只要其中一个await后面的语句出错,则返回一个rejected状态的Promise,后面的语句不会被执行。
function test(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
reject('出错了')
},)
})
}
async function f() {
await test();
console.log('上面的await返回了rejected状态')
await Promise.resolve();
} f().then(v => console.log(v)).catch(e => console.log('有错误'))

在上面的代码中f函数语句内await test()下面的语句都不会被执行。

  • 如果返回fulfilled状态的Promise对象,可以使用return xxx语句指定值,不然默认为undefined

    function test(){
    return new Promise((resolve,reject)=>{
    setTimeout(()=>{
    resolve('出错了')
    },500)
    })
    }
    async function f() {
    await test();
    await Promise.resolve(456);
    return '返回值'
    } f().then(v => console.log(v)).catch(e => console.log('有错误'))

    控制台输出“返回值”,如果注释掉f函数里面的return语句,控制台将输出undefined

4.await后面的代码会返回什么?

await后面的代码可以是同步代码,也可以是异步代码,相应的情况如下:

//同步函数
function syncFun(){ }
//异步函数
function asyncFun(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(456)
},1000)
})
}
async function f() {
let a=await 123; //a为123
let b=await syncFun(); //b为undefined
let c=await asyncFun() //c为
return '返回值'
}
f().then(v => console.log(v)).catch(e => console.log(e))

如果await后面是一个函数(不管是同步还是异步的),只要有错误或者异步返回的状态是rejected,则马上中止此await下面的语句,并返回一个rejected状态的Promise

es2017中的async和await要点的更多相关文章

  1. ES2017 中的 Async 和 Await

    ES2017 在 6 月最终敲定了,随之而来的是广泛的支持了我最喜欢的最喜欢的JavaScript功能: async(异步) 函数.如果你也曾为异步 Javascript 而头疼,那么这个就是为你设计 ...

  2. [译] C# 5.0 中的 Async 和 Await (整理中...)

    C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...

  3. 在MVC中使用async和await的说明

    首先,在mvc中如果要用纯异步请不要使用async和await,可以直接使用Task.Run. 其次,在mvc中使用async和await可以让系统开新线程处理Task的代码,同时不必等Task执行结 ...

  4. C# 中的Async 和 Await 的用法详解

    众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...

  5. ES7中的async和await

    ES7中的async和await 在上一章中,使用Promise将原本的回调方式转换为链式操作,这就将一个个异步执行的操作串在一条同步线上了.下一次的操作必须等待当前操作的结束. 使用Promise的 ...

  6. async和await的使用总结 ~ 竟然一直用错了c#中的async和await的使用。。

    对于c#中的async和await的使用,没想到我一直竟然都有一个错误.. ..还是总结太少,这里记录下. 这里以做早餐为例 流程如下: 倒一杯咖啡. 加热平底锅,然后煎两个鸡蛋. 煎三片培根. 烤两 ...

  7. ES2017中的async函数

    前面的话 ES2017标准引入了 async 函数,使得异步操作变得更加方便.本文将详细介绍async函数 概述 async 函数是 Generator 函数的语法糖 使用Generator 函数,依 ...

  8. .NET中的async和await关键字使用及Task异步调用实例

    其实早在.NET 4.5的时候M$就在.NET中引入了async和await关键字(VB为Async和Await)来简化异步调用的编程模式.我也早就体验过了,现在写一篇日志来记录一下顺便凑日志数量(以 ...

  9. C# 中的 Async 和 Await

    这篇文章由Filip Ekberg为DNC杂志编写. 自跟随着.NET 4.5 及Visual Studio 2012的C# 5.0起,我们能够使用涉及到async和await关键字的新的异步模式.有 ...

随机推荐

  1. html常见元素和理解

    html常见元素分为两类,一类是header区的元素,一类是body区的元素 header区元素: meta title style link scipt base 里面包括像meta,title,s ...

  2. 【转】onConfigurationChanged

    http://blog.csdn.net/xiaodongvtion/article/details/679938 转载自该文章. 注意:onConfigurationChanged事件并不是只有屏幕 ...

  3. 二、IntelliJ IDEA 安装目录的核心文件讲解

    首先,咱们回顾一下前两篇关于 IntelliJ IDEA 的博文的内容: 在“在 Windows 系统下安装 IntelliJ IDEA 的方法”中,咱们知道了在 Windows 系统下如何下载并安装 ...

  4. HDU 1399 Starship Hakodate-maru(暴力搜索)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1399 Starship Hakodate-maru Time Limit: 2000/1000 MS ...

  5. 【其它】Nook HD刷机

    很久以前的 Nook HD 平板刷机.只能用 microSD(TF)卡刷.需要的软件全都保存在了自己的百度网盘,自己亲测有效. 一.准备工作 1.首先,将tf卡格式化为fat32格式,实测可以使用.将 ...

  6. Ajax,Json数据格式

    同步和异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待     卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随     意做其他事 ...

  7. PL/SQL12的安装与使用

    楼主比较懒,直接放一个别人的链接吧,比较全面. 大致过程就是,下载pl/sql    下载oracle instance client    然后配置oci.dll     添加 一个连接具体数据库的 ...

  8. iOS Block界面反向传值小demo

    1.在第二个视图控制器的.h文件中定义声明Block属性: // 定义block @property (nonatomic, copy) void (^NextViewControllerBlock) ...

  9. 原生js方面的兼容性问题

    1.关于获取行外样式 currentStyle 和 getComputedStyle 出现的兼容性问题  我们都知道js通过style不可以获取行外样式,当我们需要获取行外样式时:  我们一般通过这两 ...

  10. #leetcode刷题之路1-两数之和

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商. 示例 1:输入: ...