generator函数

yield可以返回值,也可以传入值

形式:

注意!generator不能写成arrow function的形式!!!

function *函数(){
代码1... let a = yield b; //b可以返回去给c 代码2...
}
let Obj=函数(); let c = Obj.next(); //执行代码1
genObj.next(5); //执行代码2 这里的5可以传入给a

generator是一个异步串行的神器!!!

最传统的异步串行在前面的文章也介绍过,就是不断的嵌套回调函数,非常恶心。

用promise来写异步串行也是如此!!promise更适用与“异步并行”,即等齐所有异步结果再执行代码。

而今天的主角generator就很强势,直接可以把异步写成同步的写法~~

function *函数(){
代码1... let a = yield b; //b假设是一个promise if(a == '~~~'){
let c = yield d; //d假设是一个promise
}else{
let e = yield f;//f假设是一个promise
}
代码2...
} let g = 函数();

//h1接收第一个promise
let h1 = g.next().value;
let h2; //promise异步得到的数据传回给上面的a,把下一个promise传给h2
h1.then(res=>{h2 = g.next(res).value},err=>console.log(err)); h2.then(res=>g.next(res),err=>console.log(err));

当然上面这样写不太简洁,后面还要自己手动去next,把promise的结果传回去

我们可以考虑自己封装一个函数,采用递归的方式来自动实现下面的“next”的书写

runner

//这个runner是个函数,参数是一个generator函数
function runner(_gen){
return new Promise((resolve, reject)=>{
var gen=_gen(); _next();
//runner函数里面封装一个_next()函数用于递归
function _next(_last_res){
//首先res获取next得到的yield的返回值
var res=gen.next(_last_res);
//如果generator没有走完
if(!res.done){
var obj=res.value;
//如果返回的是promise
if(obj.then){
//等promise返回数据 递归自己 next(res) 传入promise得到的数据
obj.then((res)=>{
_next(res);
}, (err)=>{
reject(err);
});
}
//若返回的是generator
else if(typeof obj=='function'){
if(obj.constructor.toString().startsWith('function GeneratorFunction()')){
runner(obj).then(res=>_next(res), reject);
}
//obj是一个普通函数,就会传这个函数return的值
else{
_next(obj());
}
}else{
_next(obj);
}
}else{
resolve(res.value);
}
}
});
}

这样,以后写的代码就变得很简洁了!!

runner(function *(){
let userData=yield $.ajax({url: 'getUserData', dataType: 'json'}); if(userData.type=='VIP'){
let items=yield $.ajax({url: 'getVIPItems', dataType: 'json'});
}else{
let items=yield $.ajax({url: 'getItems', dataType: 'json'});
} //生成、...
});

generator详解的更多相关文章

  1. MyBatis Generator 详解

    MyBatis Generator中文文档 MyBatis Generator中文文档地址:http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中 ...

  2. MyBatis Generator 详解 【转来纯为备忘】

    版权声明:版权归博主所有,转载请带上本文链接!联系方式:abel533@gmail.com   目录(?)[+] MyBatis Generator中文文档 运行MyBatis Generator X ...

  3. MyBatis Generator 详解(转)

    MyBatis Generator中文文档 MyBatis Generator中文文档地址:http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中 ...

  4. MyBatis Generator 详解 专题

    idea中有plugin可提高效率: http://www.henryxi.com/use-idea-mybatis-plugin-generate-mapper-files eg: <?xml ...

  5. python yield generator 详解

    本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,genera ...

  6. (转)Python中的generator详解

    本文转自:http://www.cnblogs.com/xybaby/p/6322376.html 作者:xybaby 注:本文在原文基础上做了一点点修改,仅仅作为个人理解与记忆,建议直接查看原文. ...

  7. 生成器(generator) 详解

    1. 生成器是什么? 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成 ...

  8. ES6中的Promise和Generator详解

    目录 简介 Promise 什么是Promise Promise的特点 Promise的优点 Promise的缺点 Promise的用法 Promise的执行顺序 Promise.prototype. ...

  9. MyBatis Generator generatorConfig.xml配置详解

    所有Generator的xml详细说明见:http://mybatis.org/generator/configreference/xmlconfig.html (英文版) 引用 http://blo ...

随机推荐

  1. LINUX内核分析第八周总结:进程的切换和系统的一般执行过程

    一.进程调度与进程切换 1.不同的进程有不同的调度需求 第一种分类: I/O密集型(I/O-bound) 频繁的进行I/O 通常会花费很多时间等待I/O操作的完成 CPU密集型(CPU-bound) ...

  2. Spring基础之 反射(Reflection)

    1.了解Class package com.inspire.reflection.Class_api; import java.lang.reflect.Constructor; import jav ...

  3. shell脚本--continue、break

    shell中的continue和break和其他语言中的使用方法一模一样:continue用于跳过本次循环,break用于中断本层的循环 下面是使用例子: #!/bin/bash #文件名:test. ...

  4. [转载]SpringMVC的Model参数绑定方式

    SpringMVC的各种参数绑定方式 http://www.cnblogs.com/HD/p/4107674.html springMVC中复杂嵌套对象.List等集合类型数据绑定 http://ww ...

  5. vue的自定义组件和组件传值

    <div id="app"> <div>{{pmessage}}</div> //父组件 <child :message="pm ...

  6. 《微信小程序组件》收集

    https://github.com/liuqian0413/wxappUI https://github.com/liujians/Wa-UI

  7. 【Java】 内部类

    [Java]内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 使用内部类的的原因主要有三点: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 内部类可以对同一个包中的 ...

  8. python之input()、while、title()和upper()

    代码举例: # 小应用:问卷调查,记录下调查者名字和回答,询问是否继续. # 运用数据字典.while.input().title()和upper(). responses = {} flag = T ...

  9. pyhon列表去重方法总结

    开发中对数组.列表去重是非常常见的需求,对一个list中的id进行去重,有下面几种方法,前面两种方法不能保证顺序, 后面两种方法可以保持原来的顺序. 下面的代码都在Python3下测试通过, Pyth ...

  10. [资源]--完美解决--用VS中的Git做代码管理器,与他人共享代码

    1.创建代码仓库,这里说一下为什么要创建仓库,Git不能够作为源代码管理器,vs中自带的也只能够在本地进行管理,要和他们共享的话必须要有服务器端去存储代码,类似于SVN,它就有客户端和服务器端,这里推 ...