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 相关文章推荐
JS实现打开本地文件或文件夹
Mar 09 Javascript
javascript 兼容FF的onmouseenter和onmouseleave的代码
Jul 19 Javascript
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
Apr 10 Javascript
使用mouse事件实现简单的鼠标经过特效
Jan 30 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
Feb 02 Javascript
Jquery中offset()和position()的区别分析
Feb 05 Javascript
微信小程序 监听手势滑动切换页面实例详解
Jun 15 Javascript
vue中element 上传功能的实现思路
Jul 06 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
Aug 31 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
May 22 Javascript
新手快速入门微信小程序组件库 iView Weapp
Jun 24 Javascript
vue如何使用async、await实现同步请求
Dec 09 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 开发的 8 个技巧
2007/01/02 PHP
PHP实现显示照片exif信息的方法
2014/07/11 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
vue 项目常用加载器及配置详解
2018/01/22 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
Python实现简单猜数字游戏
2021/02/03 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
2014基层党员批评与自我批评范文
2014/09/24 职场文书
2015年教研员工作总结
2015/05/26 职场文书
民主生活会主持词
2015/07/01 职场文书
简单了解 MySQL 中相关的锁
2021/05/25 MySQL
Python合并pdf文件的工具
2021/07/01 Python