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 相关文章推荐
JScript中的"this"关键字使用方式补充材料
Mar 08 Javascript
基于Jquery的温度计动画效果
Jun 18 Javascript
JavaScript中为元素加上name属性的方法
May 09 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
May 03 Javascript
document节点对象的获取方式示例介绍
Dec 24 Javascript
js获取内联样式的方法
Jan 27 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 Javascript
jQuery实现6位数字密码输入框
Dec 29 Javascript
微信小程序实现图片预加载组件
Jan 18 Javascript
vue.js实例todoList项目
Jul 07 Javascript
axios+Vue实现上传文件显示进度功能
Apr 14 Javascript
ES6中定义类和对象的方法示例
Jul 31 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
Search Engine Friendly的URL设计
2006/10/09 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
JS 打印功能代码可实现打印预览、打印设置等
2014/10/31 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
校园歌咏比赛主持词
2014/03/18 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
安全责任书怎么写
2014/07/28 职场文书
优秀家长自荐材料
2014/08/26 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
环保建议书作文400字
2015/09/14 职场文书
python实战之用emoji表情生成文字
2021/05/08 Python
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL