【ES6】Generator+Promise异步编程
一、概念
首先我们要理解Generator和Promise的概念。
Generator:意思是生成器,可以在函数内部通过yeild来控制语句的执行或暂停状态。
*Foo(){
yeild console.log('step1');
yeild console.log('step2');
} run(foo){
var step = foo();
while(!step.done){
step.next();
}
} run(Foo); // step1
// step2
通过上面这个例子可以看到,使用*将Foo声明为Generator函数,然后再执行Foo的时候,不会执行到底,而是执行到第一句yeild就停下来。只有调用next()才会执行到下一步yeild。
Promise:是ES6新增的一个对象,相当于一个容器,是用来专门处理异步处理的。
function request = new Promise((resolve,reject) => {
$.ajax({
type: "GET",
url: "/someajaxurl",
contentType: "application/json",
dataType: "json",
success: function (data) {
resolve(data);
},
error: function (xhr) {
reject(xhr);
}
});
}).then(data=>{
// success method
}).catch(xhr=>{
// error method
});
二、Generator和Promise的结合
假设我们有个需求,需要调用两个接口,并且这两个接口不能同时启动异步调用,而是要先调接口1,在调接口2。
那么在没有使用Generator的情况下是这么写的。
// 使用promise异步调用数据
request(url){
return new Promise((resolve,reject) => {
$.ajax({
type: "GET",
url: "/someajaxurl",
contentType: "application/json",
dataType: "json",
success: function (data) {
resolve(data);
},
error: function (xhr) {
reject(xhr);
}
});
});
} // 先调用接口1,再点用接口2
gen(){
var nameList = [];
request('user/name1').then(data => {
nameList.push(data) ;
request('user/name2').then(data => {
nameList.push(data)
});
});
} gen();
以上例子会发现最终会有一个长嵌套的回调函数。
如果我们使用Generator的话,那么代码如下:
// 使用promise异步调用数据
request(url){
return new Promise((resolve,reject) => {
$.ajax({
type: "GET",
url: "/someajaxurl",
contentType: "application/json",
dataType: "json",
success: function (data) {
resolve(data);
},
error: function (xhr) {
reject(xhr);
}
});
});
} // 使用generator,将回调函数嵌套的写法改为同步写法
*gen(){
var nameList = [];
yeild request('user/name1').then(data => { nameList.push(data) });
yeild request('user/name2').then(data => { nameList.push(data) });
} // 执行generator的next方式
(function(){
var step = gen();
while(!step.done){
step.next();
}
});
使用generator的写法,会发现省去一大堆的嵌套,代码变得直观很多。
三、Async
上面的例子,发现代码变得直观了,但是还需要另外写个方法去执行generator。这时候ES6中的新特性Async,还可以对代码做进一步的优化。
// 使用async,效果和generator差不多,只不过将函数内部的yeild改为await.但是async自带执行器,不需要另外再写个方法去执行next.
async gen(){
var nameList = [];
await request('user/name1').then(data => { nameList.push(data) });
await request('user/name2').then(data => { nameList.push(data) });
}
【ES6】Generator+Promise异步编程的更多相关文章
- ES6笔记(7)-- Promise异步编程
系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...
- ES6入门八:Promise异步编程与模拟实现源码
Promise的基本使用入门: ——实例化promise对象与注册回调 ——宏任务与微任务的执行顺序 ——then方法的链式调用与抛出错误(throw new Error) ——链式调用的返回值与传值 ...
- Promise异步编程解决方案
Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过 Promise 构造函数来实例化. 其最基本的使用 new Promise(function(resolve,rej ...
- 学习Promise异步编程
JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...
- promise异步编程的原理
一.起源 JavaScript中的异步由来已久,不论是定时函数,事件处理函数还是ajax异步加载都是异步编程的一种形式,我们现在以nodejs中异步读取文件为例来编写一个传统意义的异步函数: var ...
- async/await actor promise 异步编程
Python协程:从yield/send到async/await http://blog.guoyb.com/2016/07/03/python-coroutine/ Async/Await替代Pro ...
- async generator promise异步方案实际运用
es7 async方案 /******************async***********************/ var timeFn=function(time){ return new P ...
- Generator的异步编程
对比下常用的异步处理的方案: 1,回调 我们常说的 “回调地狱”,就是多个异步操作时候,代码多重嵌套,异步之前形成强耦合,如果修改一处,其他地方也是跟着修改.(callback hell). 2,pr ...
- Promise异步编程整理
1.单线程模型 单线程模型指的是,JavaScript 只在一个线程上运行.也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待. 注意,JavaScript 只在一个线 ...
随机推荐
- <div>标签仿<textarea>。contentEditable=‘true’,赋予非表单标签内容可以编辑
需求:web页面需要一个文本输入框.1.该文本输入框默认状态下有个仿‘placeholder’的默认文本提示信息,2.文本框输入状态下其高度会随文本内容自动撑开. 方案选择:1.使用<texta ...
- ORACLE创建表空间 新建用户 授权
--建表空间create tablespace <用户> datafile 'D:\oradatadev\<用户>.dbf' size 200mautoextend on ne ...
- jquery-防多店铺购物车结算全选,单选,及删除,价格计算
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- C#之C#、.NET Framework、CLR的关系
转自 https://www.cnblogs.com/cocoon/p/4997005.html 补补基础: 很多人没有将C#..NET Framework(.NET框架).CLR(Common La ...
- hive 时间函数
使用时发现:1.datediff可以传入timestamp类型参数 官网文档: Date Functions The following built-in date functions are ...
- jQuery 条件搜索查询 实时取值 升降序排序
一.鼠标点击获取搜索条件中的被选中的值 创建方法 getAttrValue() 方法,每次的 .click 都要调用 function getAttrValue(){} 例如,把选中的值给到属性 ...
- day21双下方法,源码相关,异常处理
#!/usr/bin/env python# -*- coding:utf-8 -*- # 1.列举你了解的面向对象中的特殊成员,并为每个写代码示例.'''__init__初始化:class A: d ...
- (四)Python中的“四大才子”(字符串、列表、字典、集合)
前戏:在python中把数据序列分为可变(mutable)和不可变(immutable)两种 不可变:string.int.float.tuple 特点:相同对象只是占用一个内存地址,不管有多少个变量 ...
- Linux的快捷键一
- Python 高级特性之:生成器(generator)和迭代器(Iterator)
前言: 之前学习Python自动化,接触了不少python的学习,对生成器印象尤其深,网上也看了很多介绍,下面主要是这些概念的个人学习整理(如侵删). 正文: 如要创建一个非常大的列表,受到内存限制, ...