一、概念

首先我们要理解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. DFA确定有限状态自动机

    DFA 在计算理论中,确定有限状态自动机或确定有限自动机(英语:deterministic finite automaton, DFA)是一个能实现状态转移的自动机.对于一个给定的属于该自动机的状态和 ...

  2. cocos2d windows游戏平台搭建

    1. 安装VS2013 2. 下载cocos2d源代码(cocos2d-x-3.7.1) 3. 下载和安装python(2.7.10) 4. 安装完成后,将python安装路径设置到系统路径中(pat ...

  3. JS学习笔记Day23

    一.什么是Promise (一)Promise是ES6新增的解决异步(非阻塞)中存在的问题而产生的构造函数 二.Promise中的三种状态 pending(进行中) resoved(成功后) reje ...

  4. Flash设置(各种版本浏览器包括低版本IE)

    涉及到的各种版本flash百度下都能下到的,不再说明. Flash的安装比较麻烦,涉及多种浏览器.多种操作系统支持,安装.设置的地方比较多,以下说明基本涉及大部分安装过程中可能遇到的问题,如果安装或视 ...

  5. 基础概念【softmax|normalizatoin|standardization】

    目录 一.softmax 二.normalization 三.standardization 一.softmax 为什么使用softmax,不用normalization? “max” because ...

  6. 【AGC 002F】Leftmost Ball

    Description Snuke loves colorful balls. He has a total of N*K balls, K in each of his favorite N col ...

  7. 【opencv实践】边缘检测

    边缘检测: 一.canny算子 Canny边缘检测根据对信噪比与定位乘积进行测度,得到最优化逼近算子,也就是Canny算子.类似与 LoG 边缘检测方法,也属于先平滑后求导数的方法. 二.canny算 ...

  8. Java SE之[静态成员/类成员]与[非静态成员/实例成员]【static】

    定义 静态成员:又称类成员,使用static修饰符的方法和变量: 非静态成员:又称实例成员,未使用static修饰符的方法和变量. 结论 注:jdk1.8 测试源码 public class Main ...

  9. 微信小程序常见的坑

    wxml的标签跟html里面的一些标签是一样的,比如view标签相当于div标签,text标签相当于span标签. 在微信小程序中,表单元素都是原生组件,微信小程序中原生组件层级最高,所以在用inpu ...

  10. Sql server 用T-sql读取本地数据文件dbf的数据文件

    第一步启用Ad Hoc Distributed Queries  在SQLserver执行以下的语句: exec sp_configure 'show advanced options',1 reco ...