前端项目中常用es6知识总结 -- Async、Await让异步美如画
项目开发中一些常用的es6知识,主要是为以后分享小程序开发、node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫。
项目开发常用es6介绍
1、块级作用域 let const
2、箭头函数及this指向
3、promise、asnyc await语法
4、模块化 module export和import
5、解构赋值、字符串模板
……
asnyc await
首先看一段代码示例:
var promise = () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve("我是数据")
}, 1000)
}) var func = async () => {
var data = await promise(); //await用于等待promise函数的结果
console.log(data) return data // 一秒后打印出 “我是数据”
}
console.log(func()) // Promise {<pending>} 即func函数的返回值是一个Promise
//调用就立即返回一个状态为pending的Promise,一秒后变成resolve状态
由此可以看出:
1、async表示函数里有异步操作
2、await表示紧跟在后面的表达式需要等待结果(阻塞代码往下执行)
3、async函数的返回值是 Promise 对象
既然async函数的返回值是 Promise 对象,那就可以使用then方法来接收resolve传递过来的参数,上述代码也可以这样实现:
var promise = () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve("我是数据")
}, 1000)
}) var func = async () => {
var data = await promise(); //await用于等待promise函数的结果
console.log(data) return data // 一秒后打印出 “我是数据”
}
// console.log(func()) // Promise {<pending>} 即func函数的返回值是一个Promise
//调用就立即返回一个状态为pending的Promise,一秒后变成resolve状态
func().then((data) => {
console.log(data) //我是数据
})
所以,再追加一条:
4、async函数内部return语句的返回值,就是then方法回调函数的参数。
也就意味着如果async函数内部没有写return语句,then方法回调函数的参数值就是undefiend。
错误处理
如果await后面的异步操作出错,那么等同于async函数返回的 Promise 对象被reject。同样如果有多个await,其中一个出错也会将Promise 对象的状态置为reject。所以在进行错误处理的时候所以最好把await命令放在try...catch代码块中。
var promise = (data, ms) => new Promise((resolve, reject) => {
setTimeout(() => {
resolve(data)
}, ms)
}) var func = async () => {
try {
var data1 = await promise("数据1", 1000);
console.log(data1) var data2 = await promise("数据2", 1000);
console.log(data2) var data3 = await promise("数据3", 1000);
console.log(data3)
} catch (error) {
console.error(err)
}
}
func() //每隔一秒依次打印 数据1 数据2 数据3
//如果希望当前一个异步失败不影响后面的异步操作执行可以将其单独放在try{}catch(){}语句里
注意:多个await命令后面的异步操作,如果不存在相互依赖关系,最好让它们同时触发。因为当多个await后面的异步操作是一个接一个的完成的,这样会比较耗时,如果将他们同时触发则会大大缩短程序执行的时间。比如上述代码可以按照如下写法同时执行:
var promise = (data, ms) => new Promise((resolve, reject) => {
setTimeout(() => {
resolve(data)
}, ms)
})
var func = async () => {
try {
//写法1
var data = await Promise.all([promise("数据1", 1000), promise("数据2", 1000), promise("数据3", 1000)]);
console.log(data) //["数据1", "数据2", "数据3"]
//写法2
var datafn1 = promise("数据1", 1000);
var datafn2 = promise("数据2", 1000);
var datafn3 = promise("数据3", 1000);
var data1 = await datafn1;
var data2 = await datafn2;
var data3 = await datafn3;
console.log(data1, data2, data3) //数据1 数据2 数据3
} catch (error) {
console.error(error)
}
}
func()
上面两种写法,都是同时触发,这样就会缩短程序的执行时间。 注意:正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。
async function func() {
// return 123;
// return await 123;
return await Promise.resolve(123)
}
func().then(function(data) {
console.log(data) //
})
当然:如果func函数内部没有写return,then方法的回调函数里data就等于undefined
前端项目中常用es6知识总结 -- Async、Await让异步美如画的更多相关文章
- 前端项目中常用es6知识总结 -- let、const及数据类型延伸
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2 ...
- 前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- 前端项目中常用es6知识总结 -- Promise逃脱回调地狱
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- 使用ES6新特性async await进行异步处理
我们往往在项目中会遇到这样的业务需求,就是首先先进行一个ajax请求,然后再进行下一个ajax请求,而下一个请求需要使用上一个请求得到的数据,请求少了还好说,如果多了,就要一层一层的嵌套,就好像有点c ...
- async+await处理异步问题
在编写网页的时候我们常常会遇到异步问题,async+await是es6提出的解决异步的方法,下面我们来看看这个方法怎么实现解决异步的, 大家都知道,setTimeout是一个定时器.他是一个异步执行的 ...
- ES6系列之项目中常用的新特性
ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...
- 在Vue&Element前端项目中,对于字典列表的显示处理
在很多项目开发中,我们为了使用方便,一般都会封装一些自定义组件来简化界面的显示处理,例如参照字典的下拉列表显示,是我们项目中经常用到的功能之一,本篇随笔介绍在Vue&Element前端项目中如 ...
- Android 项目中常用到的第三方组件
项目中常用到的第三方组件 1 社会化分享ShareSDK-Core-2.5.9.jarShareSDK-QQ-2.5.9.jarShareSDK-QZone-2.5.9.jarShareSDK-Sin ...
- 项目中常用js方法整理common.js
抽空把项目中常用js方法整理成了common.js,都是网上搜集而来的,大家一起分享吧. var h = {}; h.get = function (url, data, ok, error) { $ ...
随机推荐
- Java Exception和Error的差别
Java中异常的抽象类是Throwable,在此基础上.派生出两大类:Error和Exception. Error是程序中的严重错误,不应该用try-catch包括.Javadoc的说明例如以下: A ...
- google浏览器修改网页字符编码
google浏览器修改网页字符编码 直接在google浏览器的应用拓展程序里面搜 Charset,第一个就是 于是就有了
- xcode 条件调试
添加条件 有时候我们可能会在某个循环中创建断点,但一次又一次地点击 continue 直到我们想要的条件出现,显然是一种非常低效的方式.好在 Xcode 为我们提供了条件断点. 首先在下列代码中插入一 ...
- XT800 在域环境在运行设置
测试时先将防火墙关了,不然无法远程,找个问题后再打开防火墙 0. 防火墙中建立规则,允许XT800通过. 1.在客户端当前用户下运行XT800安装程序 2.输入管理员账号及密码 3.安装时选择D或E盘 ...
- Python正则表达式初识(二)
前几天给大家分享了Python正则表达式初识(一),介绍了正则表达式中的三个特殊字符“^”.“.”和“*”,感兴趣的伙伴可以戳进去看看,今天小编继续给大家分享Python正则表达式相关特殊字符知识点. ...
- AJAX 前后端交互 验证信息是否正确
1.前段: function checkPtCode(obj){ $.ajax({ type: "post", url: "xxxxxxx", data: {& ...
- Cocos2D实现RPG队伍菜单随意调整角色顺序的效果
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 前一篇我们实现了队伍实现拖尾效果,可是在实际游戏中我们往往须要 ...
- 实验记录三 通用输入输出(GPIO)
之前把全部程序都跑了一次后,得到了导师下一步的安排. 例如以下: 1.编写一个程序.实如今LCD上显示一个万年历,包含年月日 星期 还有室内的温度.2.编写一个程序,将原来的交通灯改为跑马灯. 期限是 ...
- js 图片轮转
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- hdu 1171 Big Event in HDU(01背包)
代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; in ...