async/await方法解析
欲了解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方法解析的更多相关文章
- async/await使用深入详解
async和await作为异步模型代码编写的语法糖已经提供了一段时间不过一直没怎么用,由于最近需要在BeetleX webapi中集成对Task方法的支持,所以对async和await有了深入的了解和 ...
- async/Await使用和原理
await/async是.NetFramework4.5出现的,是语法糖,由编译器提供的功能! await/async 是C#保留关键字,通常是成对出现,一般的建议是:要么不用,要么用到底 async ...
- ES7 之 Async/await 的使用
在 js 异步请求数据时,通常,我们多采用回调函数的方式解决,但是,如果有多个回调函数嵌套时,代码显得很不优雅,维护成本也相应较高. ES6 提供的 Promise 方法和 ES7 提供的 Async ...
- 异步编程之Async,Await和ConfigureAwait的关系
在.NET Framework 4.5中,async / await关键字已添加到该版本中,简化多线程操作,以使异步编程更易于使用.为了最大化利用资源而不挂起UI,你应该尽可能地尝试使用异步编程.虽然 ...
- Async,Await和ConfigureAwait的关系
[转自]https://mp.weixin.qq.com/s/h10V-FshGoaQUWFPfy-azg 在.NET Framework 4.5中,async / await关键字已添加到该版本中, ...
- Promise和async/await
1.promise对象 promise 对象有三种状态:pending(进行中).fulfilled(已成功)和 rejected(已失败).promise 对象的状态改变,只有两种可能:从 pend ...
- C#异步编程由浅入深(二)Async/Await的作用.
考虑到直接讲实现一个类Task库思维有点跳跃,所以本节主要讲解Async/Await的本质作用(解决了什么问题),以及Async/Await的工作原理.实现一个类Task的库则放在后面讲.首先回顾 ...
- .Net Core中无处不在的Async/Await是如何提升性能的?
一.简介 Async/Await在.Net Core中真的是无处不在,到处都是异步操作,那为什么要用?有什么作用?别人说能提升性能?网上一堆文章看的绕晕了也没说清楚, 所以这里从理论,实践,原理一个个 ...
- Axios及其async await封装
Axios(IE8+) 基于promise的http库可用于浏览器与node.js 1.特性 支持promise API 拦截请求和相应 转换请求数据和响应数据 取消请求 自动转换JSON数据 客户端 ...
随机推荐
- SQL SERVER 2000安装教程图文详解
注意:Windows XP不能装企业版.win2000\win2003服务器安装企业版一.硬件和操作系统要求 下表说明安装 Microsoft SQL Server 2000 或 SQL Server ...
- Spring MVC生成JSON数据
以下示例演示如何使用Spring Web MVC框架生成JSON数据格式.首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: ...
- hadoop之WordCount源代码分析
//近期在研究hadoop.第一个想要要開始研究的必然是wordcount程序了.看了<hadoop应用开发实战解说>结合自己的理解,对wordcount的源代码进行分析. <pre ...
- 在EntityFramework(EF)中删除主从表记录
删除主表: 如果要删除单个的Book对象,由于启用了级联删除,干掉一个Book,它所关联的所有BookReview也一并删除了. (说的简单,如果用Attach方法或者Remove,加修改删除状态, ...
- EditTextView
package com.egojit.android.sops.views.EditText; import android.content.Context; import android.graph ...
- IDEA : Git Pull Failed 解决(IDEA中使用stash功能)
一.问题: 本地要commit代码,commit之前需pull代码,但pull提示冲突.如下 Git Pull Failed Your local changes would be overwritt ...
- Oracle DBA的学习(笔记)
1.软件任务分组:系统分析师.系统设计师.程序员.测试人员.开发dba.系统架构师.实施人员. 2.常用设计图:活动图.用例图.类图.序列图. 2010-9-15(dba学习) 1.1 Oracle产 ...
- DevExpress控件-lookupedit的使用方法详解(图文)转http://blog.csdn.net/qq395537505/article/details/50920508
绑定数据源: lookupedit.Properties.ValueMember = 实际要用的字段; //相当于editvalue lookupedit.Properties.DisplayMemb ...
- 检测当前的语言环境是否使用了 UTF-8 编码(三篇文章:先用setlocale()设置编码,再用nl_langinfo()进行检测。locale对象可以使用langLocale.name() == "zh_CN"判断)
C/C++程序中,locale(即系统区域设置,即国家或地区设置)将决定程序所使用的当前语言编码.日期格式.数字格式及其它与区域有关的设置,locale设置的正确与否将影响到程序中字符串处理(wcha ...
- 001-web基本程序搭建
一.IDEA创建项目 1.基本项目创建 1.1.基本步骤 1.Create New Project [File→New→Project]→New Project 2.maven→group.artif ...