欲了解await,必须先了解Promise,可参考: http://www.cnblogs.com/yanze/p/6347646.html

支持度: ES6已支持Promise,ES7也决定支持await

首先查看一个实例:

var f= ()=> {
return new Promise((resolve, reject)=> {
setTimeout(function(){
console.log(1)
resolve(1)
}, 2000)
})
} var tryAwait= async ()=>{
var data= await f()
console.log(data)
}

用同步的思维方式去解决异步的代码,省去了传统方式繁琐的回调和promise方式的多重promise。

注意项:

1.await只能在async函数内使用

2.await后面一般接着promise对象或其他可等待的对象,会阻塞代码,等待其返回值,当然也能是一般变量,但会立即执行

什么是其他可等待的对象,这个后面说

接下来是传统方式:

var f= ()=> {
setTimeout(function(){
console.log(1)
traditional(1)
}, 2000)
}
f()
var traditional= (data)=> {
console.log(data)
}

弊端: 代码繁琐,逻辑冗杂,在多重回调的情况下尤为如此(此例也许不明显,毕竟只是实例,但相信各位也明白)

单纯promise的方式:

var f= ()=> {
return new Promise((resolve, reject)=> {
setTimeout(()=> {
console.log(1)
resolve(1)
}, 2000)
})
}
f().then((data)=> {
console.log(data)
})

弊端: 每个then方法内部都是一个独立作用域,若是想共享数据,就要将部分数据暴露在外场,在then内部赋值一次

且要是有很多then方法,代码会充满Promise方法

本文参考: http://www.tuicool.com/articles/ZZnuQzZ

-------------------------------------------------

什么是要等待的值?

Promise对象当然可以

async function testAsync(){
let res= await returnP()
console.log(res)//3
} function returnP(){
return new Promise((resolve)=>{
setTimeout(()=>{
resolve(3)
},3000)
})
} testAsync()

then的写法也是可以的(then方法返回一个promise对象!

async function testAsync(){
let res= await returnP()
console.log(res) //55
} function returnP(){
return new Promise((resolve)=>{
setTimeout(()=>{
resolve(3)
},3000)
}).then(()=>{
return 55
})
} testAsync()

----------------------------------------------------------

setTimeout?不行

async function testAsync(){
let res= await returnP()
console.log(res)
} function returnP(){
setTimeout(()=>{
return
}, 3000)
} testAsync()

await修饰的函数的返回值,可以(很有意思的写法,可形成async大串联!)

async function testAsync(){
let res= await returnP()
console.log(res)
} async function returnP(){
var a= await aa()
return a
} function aa(){
return new Promise((resolve)=>{
setTimeout(()=>{
resolve(33)
},1000)
})
} testAsync()

另外有一种工作里常见的错误写法,这里也列举出来

async function testAsync(){
let res= await returnP()
console.log(res)
} async function returnP(){
new Promise((resolve)=>{
setTimeout(()=>{resolve(1)},2000)
}).then(()=>{
return 100
})
} testAsync()

async/await方法解析的更多相关文章

  1. async/await使用深入详解

    async和await作为异步模型代码编写的语法糖已经提供了一段时间不过一直没怎么用,由于最近需要在BeetleX webapi中集成对Task方法的支持,所以对async和await有了深入的了解和 ...

  2. async/Await使用和原理

    await/async是.NetFramework4.5出现的,是语法糖,由编译器提供的功能! await/async 是C#保留关键字,通常是成对出现,一般的建议是:要么不用,要么用到底 async ...

  3. ES7 之 Async/await 的使用

    在 js 异步请求数据时,通常,我们多采用回调函数的方式解决,但是,如果有多个回调函数嵌套时,代码显得很不优雅,维护成本也相应较高. ES6 提供的 Promise 方法和 ES7 提供的 Async ...

  4. 异步编程之Async,Await和ConfigureAwait的关系

    在.NET Framework 4.5中,async / await关键字已添加到该版本中,简化多线程操作,以使异步编程更易于使用.为了最大化利用资源而不挂起UI,你应该尽可能地尝试使用异步编程.虽然 ...

  5. Async,Await和ConfigureAwait的关系

    [转自]https://mp.weixin.qq.com/s/h10V-FshGoaQUWFPfy-azg 在.NET Framework 4.5中,async / await关键字已添加到该版本中, ...

  6. Promise和async/await

    1.promise对象 promise 对象有三种状态:pending(进行中).fulfilled(已成功)和 rejected(已失败).promise 对象的状态改变,只有两种可能:从 pend ...

  7. C#异步编程由浅入深(二)Async/Await的作用.

      考虑到直接讲实现一个类Task库思维有点跳跃,所以本节主要讲解Async/Await的本质作用(解决了什么问题),以及Async/Await的工作原理.实现一个类Task的库则放在后面讲.首先回顾 ...

  8. .Net Core中无处不在的Async/Await是如何提升性能的?

    一.简介 Async/Await在.Net Core中真的是无处不在,到处都是异步操作,那为什么要用?有什么作用?别人说能提升性能?网上一堆文章看的绕晕了也没说清楚, 所以这里从理论,实践,原理一个个 ...

  9. Axios及其async await封装

    Axios(IE8+) 基于promise的http库可用于浏览器与node.js 1.特性 支持promise API 拦截请求和相应 转换请求数据和响应数据 取消请求 自动转换JSON数据 客户端 ...

随机推荐

  1. 使用nginx cache缓存网站数据实践

    Nginx本身就有缓存功能,能够缓存静态对象,比如图片.CSS.JS等内容直接缓存到本地,下次访问相同对象时,直接从缓存即可,无需访问后端静态服务器以及存储存储服务器,可以替代squid功能. 1   ...

  2. python 自动化之路 day 20 Django进阶/BBS项目【一】

    一.django进阶 1.django orm 增删改查 1.1.创建表: 1 2 3 >>> from blog.models import Blog >>> b ...

  3. shell bash使用,包括判断文件或文件夹是否存在举例

    Linux shell编程——if条件判断 if [ condition ] ;then //一定要注意[] 與裡面的內容要有空格隔开 例如 if [(空格)${a} -eq 3(空格)]; then ...

  4. awk合并两个文件并显示

    问题: 答案:

  5. 高通Quick Charge高速充电原理分析

    1 QC 2.0 1.1 高通Quick Charge 2.0 高速充电原理分析 高通的QC2.0高速充电须要手机端和充电器都要支持才行. 当将充电器端通过数据线连到手机上时,充电器默认的是将D+和D ...

  6. List ArrayList LinkedList 集合三

    因为List是有顺序的说以API中定义了 方法来处理List Collections 接口:用于操作List集合有排序sort(list);查找int binarySearch(List,obj);c ...

  7. 【spring boot logback】spring boot中logback日志乱码问题

    在初次使用logback的自定义配置文件完整的控制spring boot日志后,发现了一个无法忍受的问题,就是日志乱码. 控制台看到打印日志乱码如下: 而日志文件打开: 记事本打开 sublime打开 ...

  8. hdu 4419 线段树 扫描线 离散化 矩形面积

    //离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...

  9. #1560 : H国的身份证号码II(dp+矩阵快速幂)

    #1560 : H国的身份证号码II 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国的身份证号码是一个N位的正整数(首位不能是0).此外,由于防伪需要,一个N位正整 ...

  10. C#设计模式-单实例

    单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 1.经典的模式 namespace singleClass { class ...