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 相关文章推荐
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
ajax的hide隐藏问题解决方法
Dec 11 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
Mar 31 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
Sep 06 Javascript
AngularJS $http模块POST请求实现
Apr 08 Javascript
浅谈Angular4实现热加载开发旅程
Sep 08 Javascript
Vue中使用vux配置代码详解
Sep 16 Javascript
element-ui upload组件多文件上传的示例代码
Oct 17 Javascript
一篇文章带你浅入webpack的DLL优化打包
Feb 20 Javascript
javascript实现前端成语点击验证
Jun 24 Javascript
jQuery实现鼠标拖拽登录框移动效果
Sep 13 jQuery
输入框跟随文字内容适配宽实现示例
Aug 14 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
Python定时执行之Timer用法示例
2015/05/27 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
常用的HTML5列表标签
2017/06/20 HTML / CSS
前端实现打印图像功能
2019/08/27 HTML / CSS
eBay美国官网:eBay.com
2020/10/24 全球购物
竞选班长演讲稿
2013/12/30 职场文书
物流管理专业推荐信
2014/09/06 职场文书
教师三严三实心得体会
2014/10/11 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
团委工作总结2015
2015/04/02 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
开业典礼致辞
2015/07/29 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书