JavaScript中的await/async的作用和用法


Posted in Javascript onOctober 31, 2016

await/async 是 ES7 最重要特性之一,它是目前为止 JS 最佳的异步解决方案了。虽然没有在 ES2016 中录入,但很快就到来,目前已经在 ES-Next Stage 4 阶段。

直接上例子,比如我们需要按顺序获取:产品数据=>用户数据=>评论数据

老朋友 Ajax

传统的写法,无需解释

// 获取产品数据
ajax('products.json', (products) => {
console.log('AJAX/products >>>', JSON.parse(products));
// 获取用户数据
ajax('users.json', (users) => {
console.log('AJAX/users >>>', JSON.parse(users));
// 获取评论数据
ajax('products.json', (comments) => {
console.log('AJAX/comments >>>', JSON.parse(comments));
});
});
});

不算新的朋友 Promise

Promise 已经被提及已久了,也是 ES6 的一部分。Promise 能消除 callback hell 带来的厄运金字塔,相比起来代码更清晰了。

// Promise
// 封装 Ajax,返回一个 Promise
function requestP(url) {
return new Promise(function(resolve, reject) {
ajax(url, (response) => {
resolve(JSON.parse(response));
});
});
}
// 获取产品数据
requestP('products.json').then(function(products){
console.log('Promises/products >>>', products);
});
// 获取用户数据
requestP('users.json').then(function(users){
console.log('Promises/users >>>', users);
});
// 获取评论数据
requestP('comments.json').then(function(comments){
console.log('Promises/comments >>>', comments);
});

当然使用Promise.all 可以更简洁

Promise.all([
requestP('products.json'),
requestP('users.json'),
requestP('comments.json')
])
.then(function(data) {
console.log('Parallel promises >>>', data);
});

强劲的新朋友 Generators

Generators 也是 ES6 一个新的特性,能够 暂停/执行 代码。yield 表示暂停,iterator.next 表示执行下一步,如果你不了解 Generators 也没关系,可以忽略它直接学习 await/async。

// Generators
function request(url) {
ajax(url, (response) => {
iterator.next(JSON.parse(response));
});
}
function *main() {
// 获取产品数据
let data = yield request('products.json');
// 获取用户数据
let users = yield request('users.json');
// 获取评论数据
let products = yield request('comments.json');
console.log('Generator/products >>>', products);
console.log('Generator/users >>>', users);
console.log('Generator/comments >>>', comments);
}
var iterator = main();
iterator.next();

碉堡的朋友 await/async

与 Promise 结合使用

// 封装 Ajax,返回一个 Promise
function requestP(url) {
return new Promise(function(resolve, reject) {
ajax(url, (response) => {
resolve(JSON.parse(response));
});
});
}
(async () => {
// 获取产品数据
let data = await requestP('products.json');
// 获取用户数据
let users = await requestP('users.json');
// 获取评论数据
let products = await requestP('comments.json');
console.log('ES7 Async/products >>>', products);
console.log('ES7 Async/users >>>', users);
console.log('ES7 Async/comments >>>', comments);
}());

与 Fetch API 结合使用:

(async () => {
// Async/await using the fetch API
try {
// 获取产品数据
let products = await fetch('products.json');
// Parsing products
let parsedProducts = await products.json();
// 获取用户数据
let users = await fetch('users.json');
// Parsing users
let parsedUsers = await users.json();
// 获取评论数据
let comments = await fetch('comments.json');
// Parsing comments
let parsedComments = await comments.json();
console.log('ES7 Async+fetch/products >>>', parsedProducts);
console.log('ES7 Async+fetch/users >>>', parsedUsers);
console.log('ES7 Async+fetch/comments >>>', parsedComments);
} catch (error) {
console.log(error);
}
}());

按数组顺序执行

(async () => {
let parallelData = await* [
requestP('products.json'),
requestP('users.json'),
requestP('comments.json')
];
console.log('Async parallel >>>', parallelData);
}());

再次结合 Fetch

(async () => {
let parallelDataFetch = await* [
(await fetch('products.json')).json(),
(await fetch('users.json')).json(),
(await fetch('comments.json')).json()
];
console.log('Async parallel+fetch >>>', parallelDataFetch);
}());

使用 await/async 用同步的思维去解决异步的代码,感觉非常酷非常爽!关于js中的await/async的作用和用法就给大家介绍这么多,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Jquery中增加参数与Json转换代码
Nov 20 Javascript
键盘KeyCode值列表汇总
Nov 26 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
Jul 03 Javascript
jQuery代码实现发展历程时间轴特效
Jul 30 Javascript
Javascript缓存API
Jun 14 Javascript
浅谈JavaScript中变量和函数声明的提升
Aug 09 Javascript
Node.js连接postgreSQL并进行数据操作
Dec 18 Javascript
Vue中组件之间数据的传递的示例代码
Sep 08 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
Nov 11 Javascript
React如何避免重渲染
Apr 10 Javascript
Vue CLI3 开启gzip压缩文件的方式
Sep 30 Javascript
element-ui 文件上传修改文件名的方法示例
Nov 05 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
Oct 31 #Javascript
微信小程序 开发工具快捷键整理
Oct 31 #Javascript
微信小程序 实现tabs选项卡效果实例代码
Oct 31 #Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
Oct 31 #Javascript
jQuery绑定事件的四种方式介绍
Oct 31 #Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 #Javascript
JS中作用域和变量提升(hoisting)的深入理解
Oct 31 #Javascript
You might like
PHP 如何向 MySQL 发送数据
2006/10/09 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
python 反向输出字符串的方法
2018/07/16 Python
python使用selenium实现批量文件下载
2019/03/11 Python
python利用线程实现多任务
2020/09/18 Python
全球立体声:World Wide Stereo
2018/09/29 全球购物
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
农场厂长岗位职责
2013/12/28 职场文书
给同学的道歉信
2014/01/16 职场文书
工作决心书范文
2014/03/11 职场文书
小学生家长寄语
2014/04/02 职场文书
2014年化验室工作总结
2014/11/21 职场文书
Python装饰器详细介绍
2022/03/25 Python