一、概念

首先我们要理解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异步编程的更多相关文章

  1. ES6笔记(7)-- Promise异步编程

    系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...

  2. ES6入门八:Promise异步编程与模拟实现源码

    Promise的基本使用入门: ——实例化promise对象与注册回调 ——宏任务与微任务的执行顺序 ——then方法的链式调用与抛出错误(throw new Error) ——链式调用的返回值与传值 ...

  3. Promise异步编程解决方案

    Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过 Promise 构造函数来实例化. 其最基本的使用 new Promise(function(resolve,rej ...

  4. 学习Promise异步编程

    JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...

  5. promise异步编程的原理

    一.起源 JavaScript中的异步由来已久,不论是定时函数,事件处理函数还是ajax异步加载都是异步编程的一种形式,我们现在以nodejs中异步读取文件为例来编写一个传统意义的异步函数: var ...

  6. async/await actor promise 异步编程

    Python协程:从yield/send到async/await http://blog.guoyb.com/2016/07/03/python-coroutine/ Async/Await替代Pro ...

  7. async generator promise异步方案实际运用

    es7 async方案 /******************async***********************/ var timeFn=function(time){ return new P ...

  8. Generator的异步编程

    对比下常用的异步处理的方案: 1,回调 我们常说的 “回调地狱”,就是多个异步操作时候,代码多重嵌套,异步之前形成强耦合,如果修改一处,其他地方也是跟着修改.(callback hell). 2,pr ...

  9. Promise异步编程整理

    1.单线程模型 单线程模型指的是,JavaScript 只在一个线程上运行.也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待. 注意,JavaScript 只在一个线 ...

随机推荐

  1. SQLServer安装步骤(2012版为例)

    提示:SQLServer安装较为耗时,请确保时间充足. 图文如果无法正常显示,请移步 SQLServer安装步骤 第一步:下载 下载地址:https://www.microsoft.com/zh-cn ...

  2. (十三)事件分发器——event()函数,事件过滤

    事件分发器——event()函数 事件过滤 事件进入窗口之前被拦截 eventFilter #include "mywidget.h" #include "ui_mywi ...

  3. 机器学习KNN算法

    KNN(最邻近规则分类K-Nearest-Neighibor)KNN算法 1. 综述      1.1 Cover和Hart在1968年提出了最初的邻近算法      1.2 分类(classific ...

  4. 十行代码分清Java 的 || 和 &&

    发现有些同学到现在还没分不清 || 和 &&的作用 package System; /** * * @ClassName: RandomTest * @Description: 十行代 ...

  5. express起一个代理服务器,webpack-dev-server同时起多个

    由于系统业务比较复杂,微前端(多页应用)实现期望用一个app一个webpack的形式,这样可以更好隔离,而且每个app的webpack config可以定制. Nginx在前端项目中安装比较麻烦,所以 ...

  6. Python包中 __init__.py文件的作用

    原创连接 https://www.cnblogs.com/AlwinXu/p/5598543.html Python包中 __init__.py文件的作用 在创建python包的过程中,IDE都会在包 ...

  7. k-means cluster images

    说明 慕课网上例子,使用k-means算法分类图片, 此处调试运行通过, 并添加包管理内容, 使得其他同学容易运行. 例子地址: https://github.com/fanqingsong/clus ...

  8. SimMechanics/Second Generation倒立摆模型建立及初步仿真学习

    笔者最近捣鼓Simulink,发现MATLAB的仿真模块真的十分强大,以前只是在命令窗口敲点代码,直到不小心敲入simulink,就一发不可收拾.话说simulink的模块化建模确实方便,只要拖拽框框 ...

  9. 打开即时通讯服务器openfire的大门

    1.什么是即时通讯 你现在最常用的软件是什么,如果我没有猜错,应该是QQ和微信,是的,他们就是即时通讯软件. 一个可以让你无时无刻,只要有网络就能够沟通的工具,就是即时通讯工具.那么本教程,我们主要以 ...

  10. MySql的Communications link failure解决办法

    在使用JDBC连接mysql时可能会遇到以下错误: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications li ...