generator详解
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详解的更多相关文章
- MyBatis Generator 详解
MyBatis Generator中文文档 MyBatis Generator中文文档地址:http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中 ...
- MyBatis Generator 详解 【转来纯为备忘】
版权声明:版权归博主所有,转载请带上本文链接!联系方式:abel533@gmail.com 目录(?)[+] MyBatis Generator中文文档 运行MyBatis Generator X ...
- MyBatis Generator 详解(转)
MyBatis Generator中文文档 MyBatis Generator中文文档地址:http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中 ...
- MyBatis Generator 详解 专题
idea中有plugin可提高效率: http://www.henryxi.com/use-idea-mybatis-plugin-generate-mapper-files eg: <?xml ...
- python yield generator 详解
本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,genera ...
- (转)Python中的generator详解
本文转自:http://www.cnblogs.com/xybaby/p/6322376.html 作者:xybaby 注:本文在原文基础上做了一点点修改,仅仅作为个人理解与记忆,建议直接查看原文. ...
- 生成器(generator) 详解
1. 生成器是什么? 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成 ...
- ES6中的Promise和Generator详解
目录 简介 Promise 什么是Promise Promise的特点 Promise的优点 Promise的缺点 Promise的用法 Promise的执行顺序 Promise.prototype. ...
- MyBatis Generator generatorConfig.xml配置详解
所有Generator的xml详细说明见:http://mybatis.org/generator/configreference/xmlconfig.html (英文版) 引用 http://blo ...
随机推荐
- 《Linux内核设计与实现》读书笔记 4 进程调度
第四章进程调度 进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统.调度程序是多任务操作系统的基础.通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的 ...
- hbase 1.2.1 分布式安装
1.机器信息 五台centos 64位机器 2.集群规划 Server Name Hadoop Cluster Zookeeper Ensemble HBase Cluster Ip Hado ...
- 单工程搭建springmvc+spring+mybatis(maven,idea)
单工程搭建springmvc+spring+mybatis(maven,idea) 1.pom.xml <properties> <project.build.sourceEncod ...
- 第三个Sprint ------第八天
四则运算APP开发基本完成! PC端运行结果截图 移动端(华为手机)测试截图 总结:通过这次课程设计,我体会到团队协作的重要性,也体会到了理论联系实际的意义.做一件事,要坚持不懈,不能半途而废!
- zookeeper安装和使用 windows环境(转)
原文地址: http://blog.csdn.net/tlk20071/article/details/52028945 简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是G ...
- [转]Spring通过@Value注解注入属性的几种方式
原文地址:https://blog.csdn.net/csujiangyu/article/details/50945486 ------------------------------------- ...
- python2.7.x的字符串编码到底什么鬼?(中文和英文的处理)
一直以来我其实一直对python的编码弄得非常晕,能正常编码,也能处理一些情况.但是始终不明白有些问题究竟为何出,原因是什么,为什么要这样用. 今天晚上正好好好研究了一番解答了自己心中的困惑. Q:p ...
- 利用可变参数打印log
// ConsoleApplication1.cpp: 定义控制台应用程序的入口点. // #pragma once #include <string> #include <Wind ...
- BZOJ2724 [Violet]蒲公英(分块)
区间众数.分块,预处理任意两块间所有数的众数,和每块中所有数的出现次数的前缀和.查询时对不是整块的部分暴力,显然只有这里出现的数可能更新答案.于是可以优美地做到O(n√n). #include< ...
- Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...