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 相关文章推荐
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
Mar 08 Javascript
javaScript 计算两个日期的天数相差(示例代码)
Dec 27 Javascript
JSON与XML优缺点对比分析
Jul 17 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
Aug 25 Javascript
JS模拟Dialog弹出浮动框效果代码
Oct 16 Javascript
jquery ajax分页插件的简单实现
Jan 27 Javascript
vue-router 组件复用问题详解
Jan 22 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
May 30 Javascript
Vue表单demo v-model双向绑定问题
Jun 29 Javascript
JS实现图片切换效果
Nov 17 Javascript
vue获取时间戳转换为日期格式代码实例
Apr 17 Javascript
JavaScript小技巧带你提升你的代码技能
Sep 15 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
mysql下创建字段并设置主键的php代码
2010/05/16 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
Javascript 两个窗体之间传值实现代码
2009/09/25 Javascript
javascript 精粹笔记
2010/05/09 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
python操作MySQL数据库具体方法
2013/10/28 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
python 基于opencv去除图片阴影
2021/01/26 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
《英英学古诗》教学反思
2014/04/11 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
工作检讨书怎么写
2014/10/10 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
酒店温馨提示语
2015/07/14 职场文书
八年级物理教学反思
2016/02/19 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电