Generator yield语法和 co模块
Generator yield 语法使用,也叫生成器,实际上就是多个异步按顺序执行
function* gen(){
    //第一步 开始
    console.log("start");
    var a =  yield "aaa";
    //第二步
    console.log("---",a); //2
    var x = yield 222;
    //第三步
    console.log("---",x);//3
    var y = yield 4;
    //第四步
    console.log("---",y);//6
    return "over"
}
var g = gen(); //任何东西都没有执行,返回的一个迭代器, 可以使用 for  of  遍历
// next 的传值是上一段  yield 的返回值
console.log(g.next(1));
console.log(g.next(2));
console.log(g.next(3));
console.log(g.next(6));
可以看到,上面最后的调用,是可以封装成递归的,免得重复代码,多层嵌套,比如自己写一个,自运行的
const promisify = require("util").promisify;
const fs = require("fs");
const readFile = promisify(fs.readFile);
const path = require("path");
function resolve(p){
	return path.resolve(__dirname,p);
}
function* gen(){
	var data1 = yield readFile(resolve("./data/data1.json"),"utf-8");
	console.log(data1);
	var data2 = yield readFile(resolve("./data/data2.json"),"utf-8");
	console.log(data2);
	var num = yield 123456;
	console.log(num);
}
//简单版自运行co模块
function co(gen){
	var g = gen(); //任何东西都没有执行,返回的一个迭代器
	function next(res){
		var result = g.next(res);
		if(!result.done){
			Promise.resolve(result.value).then((res)=>{
				next(res);
			}).catch((e)=>{
				throw new Error(e);
			})
		}
	}
	next();
}
co(gen);
  
或者使用co模块
const fs = require('fs');
const co =require('co');
const readFile = function (fileName) {
  return new Promise(function (resolve, reject) {
    fs.readFile(fileName, "utf-8",function(error, data) {
      if (error) return reject(error);
      resolve(data);
    });
  });
};
const gen = function* () {
  const f1 = yield readFile('./data1.txt');
  const f2 = yield readFile('./data2.txt');
  console.log(f1);
  console.log(f2);
};
co(gen).then(function(data){
	console.log(data);
}).catch(function(ct){
	console.log(ct);
})
Yield * 表达式
如果在 Generator 函数内部,调用另一个 Generator 函数。需要在前者的函数体内部,自己手动完成遍历。
function* foo() {
  yield 'a';
  yield 'b';
}
function* bar() {
  yield 'x';
  // 手动遍历 foo()
  for (let i of foo()) {
    console.log(i);
  }
  yield 'y';
}
for (let v of bar()){
  console.log(v);
}
ES6 提供了yield*表达式,作为解决办法,用来在一个 Generator 函数里面执行另一个 Generator 函数。
function* bar() {
  yield 'x';
  yield* foo();
  yield 'y';
}
flat 数组
var arr = [1, [[2, 3], 4], [5, 6]];
var flat = function* (a) {
  a.forEach(function (item) {
    if (typeof item !== 'number') {
      yield* flat(item);
    } else {
      yield item;
    }
  });
};
for (var f of flat(arr)){
  console.log(f);
}
Generator yield语法和 co模块的更多相关文章
- Python爬虫 XPath语法和lxml模块
		XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ... 
- XPath语法和lxml模块
		XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ... 
- Python: generator, yield, yield from 详解
		1.Generator Expressions 生成器表达式是用小括号表示的简单生成器标记法: generator_expression ::= "(" expression co ... 
- 好习惯: 用controller as 语法和$inject数组注入
		angular好习惯1: 用controller as 语法和$inject数组注入 1) 像普通的JS类一样实现controller,摆脱$scope 2) 用.$inject数组注入相关模块,便于 ... 
- laravel基础课程---9、视图(lavarel的模板语法和tp相比怎样)
		laravel基础课程---9.视图(lavarel的模板语法和tp相比怎样) 一.总结 一句话总结: lavarel的模板语法比thinkphp好用很多:和html代码配合的更好 lavarel比t ... 
- OC第五节 ——点语法和@property
		一.setter和getter函数 1.回忆:如何访问对象中的成员变量 2.setter和getter函数的作用 setter 方法: 修改对象的字段/实例变 ... 
- Markdown 语法和 MWeb 写作使用说明
		---恢复内容开始--- # Markdown 语法和 MWeb 写作使用说明 Markdown 的设计哲学 Markdown 的目標是實現「易讀易寫」. 不過最需要強調的便是它的可讀性.一份使用 M ... 
- Markdown语法和MWeb使用说明
		Markdown 语法和 MWeb 写作使用说明 开始写博客,首先熟悉一下Markdown,以前过看GitHub里的README.MD,感受到了这种文字排版的简洁美观. 写博客是一种有效的学习总结和分 ... 
- Generator & yield write in sync way
		Generator & yield write in sync way var p = new Promise(function(resolve, reject){ setTimeout(fu ... 
随机推荐
- Spark RDD Transformation 简单用例(二)
			aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) aggregateByKey(zeroValue)(seqOp, combOp, [numTa ... 
- Jexus 安装asp.net mvc EF 项目引发的错误总
			1.Linux 中的文件路径问题(配置文件路径),必须使用左斜杆 “/” 2.MVC 看 View/Web.config 下的配置文件中版本不对报错,如下: Could not locate Razo ... 
- Missing artifact com.h2database:h2:jar:1.4.197
			之前OK的项目再次打开pom上报错: 一起出现的现象: maven库中这个包和H2数据库的包每次项目右键→maven→update project都会产生.lastupdate文件.原来是以前从mav ... 
- okvis代码解读
			okvis_timing模块 提供时间转换的功能函数 okvis_util模块 包含 assert_macros.hpp 该文件包含一些有用的断言宏. source_file_pos.hpp 该文件 ... 
- Orchard之Module开发
			一:生成新项目 首先,要启动 Code Generation,参考<Orchard之生成新模板>. 其次,进入命令行,输入: codegen module Tminji.Requireme ... 
- CCPC-Wannafly Winter Camp Day4 Div1 - 咆咆咆哮 - [三分+贪心]
			题目链接:https://zhixincode.com/contest/18/problem/I?problem_id=267 题目描述 输入描述 输出描述 一行一个整数表示答案. 样例输入 1 32 ... 
- [No0000E7]C# 封装 与访问修饰符
			C# 支持的访问修饰符: Public Private Protected Internal Protected internal Public 访问修饰符 Public 访问修饰符允许一个类将其成员 ... 
- C#配置.INI文件
			百度搜了一些资料,好多没给示例,只给了代码.让人看了直接懵逼,后来找了个靠谱的:http://www.jb51.net/article/118591.htm 
- [daily][qemu][kvm] 使用virtfs在host与guest之间共享目录
			如题. 之前我使用NFS,NFS会有同步问题.比如编译文件时候的时间同步问题,见前边的文章. 如今,我们使用高级的virtfs: 见:https://www.linux-kvm.org/page/9p ... 
- 使用uibesizerpath + Cashaplayer画椭圆
			使用uibesizerpath Cashaplayer画椭圆: + (void)drawOvalAnimSourceView:(UIView *)sourceView { //view是曲线的背景vi ... 
