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 操作符实例代码
Oct 24 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
Sep 14 Javascript
cookie的复制与使用记住用户名实现代码
Nov 04 Javascript
jQuery中:has选择器用法实例
Dec 30 Javascript
JavaScript中常见获取元素的方法汇总
Mar 04 Javascript
js实现类似MSN提示的页面效果代码分享
Aug 24 Javascript
jQuery实用技巧必备(上)
Nov 02 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
Oct 05 Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 Javascript
Angular实现svg和png图片下载实现
May 05 Javascript
vue回到顶部监听滚动事件详解
Aug 02 Javascript
js实现点击生成随机div
Jan 16 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文本数据库的搜索方法
2006/10/09 PHP
解析dedecms空间迁移步骤详解
2013/05/15 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
对node.js中render和send的用法详解
2018/05/14 Javascript
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
Python中Collection的使用小技巧
2014/08/18 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
python实现简易动态时钟
2018/11/19 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
python中字符串的编码与解码详析
2020/12/03 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
如何开发安全的AJAX应用
2014/03/26 面试题
秦兵马俑教学反思
2014/02/07 职场文书
派出所所长先进事迹
2014/05/19 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
2015大一新生军训感言
2015/08/01 职场文书
教师病假条范文
2015/08/17 职场文书