快速理解和使用 ES7 await/async

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((products) => {console.log('Promises/products >>>', products);// 获取用户数据return requestP('users.json');
}).then((users) => {console.log('Promises/users >>>', users);// 获取评论数据return requestP('comments.json');
}).then((comments) => {console.log('Promises/comments >>>', comments);
});

强劲的新朋友 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 APItry {// 获取产品数据let products = await fetch('products.json');// Parsing productslet parsedProducts = await products.json();// 获取用户数据let users = await fetch('users.json');// Parsing userslet parsedUsers = await users.json();// 获取评论数据let comments = await fetch('comments.json');// Parsing commentslet 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);}
}());

再次结合 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 用同步的思维去解决异步的代码,感觉非常酷非常爽!

参考文献[原文]:https://github.com/jaydson/es...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jdeveloper优化:

D:\jdevstudio10133\jdev\bin\jdev.conf末尾加上下面的AddVMOption -Dsun.java2d.noddrawtrueAddVMOption -Dsun.java2d.ddoffscreenfalse 转载于:https://www.cnblogs.com/sprinng/p/4780112.html

linux make java版本,告诉make是否在Windows或Linux上运行

更新请阅读这个类似但更好的答案:https://stackoverflow.com/a/14777895/938111make (和 gcc )可以使用Cygwin或MinGW在MS-Windows上轻松安装 .正如ldigas所说, make 可以使用 UNAME:$(shell uname) 检测平台(命令 uname 也由Cygwin或MinGW安…

MPI多机器实现并行计算

最近使用一个系统的分布式版本搭建测试环境,该系统是基于MPI实现的并行计算,MPI是传统基于msg的系统,这个框架非常灵活,对程序的结构没有太多约束,高效实用简单,下面是MPI在多台机器上实现并行计算的过程。…

Jenkins_获取源码编译并启动服务(二)

一、创建Maven项目二、设置SVN信息三、设置构建触发器四、设置Maven命令五、设置构建后发邮件信息(参考文章一)六、设置构建后拷贝文件到远程机器并执行命令来自为知笔记(Wiz)

php 判断页面加载完,所有ajax执行完且页面加载完判断

jquery ajax&load 方法导致 js效果不显示或显示后由于加载后ajax 重新布局页面导致效果错误。解决思路:需要在ajax get post 或 load 等执行完后再去执行方法就不会由于他们没执行完导致的最终错误。那么首先看load 方法定义:jQuery ajax - load() 方…

正确理解ThreadLocal

想必很多朋友对 ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理 解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场…

2018.7.10 个人博客文章=利用ORM创建分类和ORM的内置函数

昨天的注册收尾工作 其实就差了和MySql联系起来的部分,这部分很简单,首先要做的就是保存用户通过from传送过来的头像文件: """ 保存头像文件 """ file request.FILES.get(avatar) file_path os.path.join(st…

python 列表与元组的操作简介

上一篇:Python 序列通用操作介绍 列表 列表是可变的(mutable)——可以改变列表的内容,这不同于字符串和元组,字符串和元组都是不可变的。接下来讨论一下列表所提供的方法。 list函数 可以使用list函数来创建列表: list(Hello) [H,…

mfc嵌入matlab绘图窗口,将matlab的图嵌入MFC

【实例简介】VS调用matlab画图模块编译成的动态链接库,并在MFC显示。【实例截图】【核心代码】3b0582a3-4ea8-4a61-ba33-e448be563b88└── 将matlab的图嵌入MFC├── matlab_2010b与VS2008_混合编程的实现.pdf├── TestWithData│ ├── Debug│ │ ├─…

python multiprocessing 和tcp

#用类方法 服务端from socket import *from multiprocessing import Processimport osclass Myprocess(Process): def __init__(self, conn): self.conn conn super().__init__() def run(self): conn self.conn start True whil…

matlab 画三维花瓶,精美花瓶建模教程

1、首先,草图单位为mm,进入前视图绘制如图草图,花瓶的基本形状轮廓2、然后对草图进行旋转3、旋转出曲面后,在顶部边线新建一个基准面4、继续在前视图绘制草图,如图绘制一弧线5、然后进行旋转6、可以得到图示的两个曲面…

PKI系统相关知识点介绍

公钥基础设施(Public Key Infrastructure,简称PKI)是目前网络安全建设的基础与核心,是电子商务安全实施的基本保障,因此,对PKI技术的研究和开发成为目前信息安全领域的热点。本文对PKI技术进行了全面的分析…

android 打印java堆栈,Android打印堆栈

java打印堆栈方法一:异常对象打印堆栈Exception e new Exception("this is a log");e.printStackTrace();方法二:Log打印获取异常的堆栈并打印Log.e(“dump_test”,Log.getStackTraceString(new Throwable()));C\C打印堆栈方法一:…

实际算法项目工程上手日志C/C++

#pragma once 为了保证头文件只被编译一次,通常放在头文件的顶部 #define IN #define OUT #define INOUT 这个只在逻辑上起作用, IN 表示输入参数,指针指向的值不会修改; OUT 表示输出参数,指针指向的值会修改&a…

Arduino 控制超声波测距模块

一.实物图 二.例子代码 用到数字2 和3 引脚,还有两个就是vcc GND两个阴脚,用模块连线比较简单 转载于:https://www.cnblogs.com/caoguo/p/4785700.html

Linux安装source-code-pro字体

2019独角兽企业重金招聘Python工程师标准>>> 1.下载source-code-pro字体 从GitHub下载 https://github.com/adobe-fonts/source-code-pro/releases 2.解压文件,将OTF格式的文件夹重新命名一下,这里我命名为source-code-pro,然后将…

dft对称性 matlab实验,数字信号处理实验指导书(审)

(0???2?)上对X(ej?)均匀采样得到?X(k)?X(ej?)??2?k/N??n???x(n)e?j2?kn/N 0?k?N?1可以看到X(k)也是频域上的有限长序列,长度为N。序列X(k)称为序列x(n)的N点DFT。N称为DFT变换区间长度。 通常表示WN?e?j2?/N可将定义式表示为?X(k)??x(n)…

PI

并不是所有东西都可以套PI的,只有满足上述这类的数学关系才可以。 转速经过PI调节得到电流也是有原因的。从下图中可以发现,转速 k*Iq/s,s是拉普拉斯算子,所以也是满足积分,比例关系的。 转载于:https://www.cnblogs.…

AOP之AspectJ简单使用

为什么80%的码农都做不了架构师?>>> 参考文章: 使用AspectJ在Android中实现Aop 深入理解Android之AOP自动打印日志主要知识点: 主要是JPoint、pointcuts、advice以及他们之间的关系可以通过aj文件、或AspectJ注解的Java文件实现A…

matlab drawnow连成曲线,precision recall曲线Matlab实现

在用哈希进行检索时,常会用到precision recall曲线对其性能进行定量评价。precision recall的定义在信息检索评价指标中已做了详细说明,这里再记录一下precision recall的具体实现。precision recall曲线matlab一般使用的都是下面的版本:func…