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. SPOJ8093【JZPGYZ - Sevenk Love Oimaster】

    怎么全是广义后缀自动机,我\(AC\)自动机不服 这道题可以使用的算法很多,\(SA\)或者\(SAM\)应该都可以 但是我都不会 但是这毕竟是一个多串匹配问题,\(AC\)自动机还是可以刚一刚的 我 ...

  2. Android学习笔记_76_AsyncQueryHandler的应用

    研究AsyncQueryHandler这个类的时候遇到了几个重要的不清楚的知识点 1. Handler与Thread,Looper的关系 2. HandlerThread是干什么用的 3. Threa ...

  3. 消息中间件JMS(一)

    1.JMS入门 1.1消息中间件 模块之间的依赖也称之为耦合.而耦合越多,之后的维护工作就越困难.那么如果改善系统模块调用关系.减少模块之间的耦合呢?我们接下来就介绍一种解决方案----消息中间件. ...

  4. Dapper.net ORM

    参考链接:https://github.com/StackExchange/dapper-dot-net Dapper - a simple object mapper for .Net Dapper ...

  5. linux各种抓包情况说明

    大家都知道抓包指令:tcpdump    抓包的主要目的是测试端口.网络协议通不通,以及对抓取的数据包进行分析.测试,抓包对熟悉linux的大神都不陌生,网络对于我来说也是一窍不通,只是在这里记录一下 ...

  6. iOS之某公司iOS开发笔试题

    参考答案不唯一,大家可以根据自己的理解回答,没有必要跟笔者的一样.参考笔者的答案,也许给你带来灵感! 1.对数组中的元素去重复 例如: NSArray *array = @[@"12-11& ...

  7. HTTP基本内容

    *********************HTTP基本交互*************************** HTTP请求格式:HTTP 请求由三部分组成:请求行.请求头和请求正文请求行: 请求方 ...

  8. ABAP术语-BW (Business Information Warehouse)

    BW (Business Information Warehouse) 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/14/1037761. ...

  9. harbor中碰到的问题

    harbor部署整体比较简单,但是就是这么简单的东西稍微改变点配置文件就会有不小的问题 1.问题1 部署harbor1.6发现web界面删除的镜像在push一遍上去后,镜像大小为0 且无法删除,这个问 ...

  10. httpd的prefork、worker、event

    Apache(httpd) 有3种核心MPM(Multi-Processing Module,多进程处理模块)工作模式,分别是prefork,worker和event,其中httpd-2.2的even ...