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 while语句和do while语句的区别分析
Dec 08 Javascript
jQuery层次选择器选择元素使用介绍
Apr 18 Javascript
一个不错的仿携程自定义数据下拉选择select
Sep 01 Javascript
原生js制作简单的数字键盘
Apr 24 Javascript
JS实现的颜色实时渐变效果完整实例
Mar 25 Javascript
工厂模式在JS中的实践
Jan 18 Javascript
JavaScript函数柯里化原理与用法分析
Mar 31 Javascript
浅谈Angular 的变化检测的方法
Mar 01 Javascript
layui--js控制switch的切换方法
Sep 03 Javascript
关于vue.js中实现方法内某些代码延时执行
Nov 14 Javascript
JS面向对象之单选框实现
Jan 17 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
Sep 01 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
第六节--访问属性和方法
2006/11/16 PHP
php数组的一些常见操作汇总
2011/07/17 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
React中上传图片到七牛的示例代码
2017/10/10 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
Python获取apk文件URL地址实例
2013/11/01 Python
深入Python函数编程的一些特性
2015/04/13 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
Python多进程fork()函数详解
2019/02/22 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
python 一维二维插值实例
2020/04/22 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
2020/11/24 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
印度网上药店:1mg
2017/10/13 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
后勤主管工作职责
2013/12/07 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
python实现网络五子棋
2021/04/11 Python
MySQL视图概念以及相关应用
2022/04/19 MySQL