LVPHP

JS中generater和yield的使用

说明

function* 声明(function关键字后跟一个星号)定义一个generator(生成器)函数,返回一个Generator对象。

语法

1
function* name([param[, param[, ... param]]]) { statements }

name
函数名

param
传入函数的参数名,一个函数至多可有255个参数。

statements
函数的主体

描述

生成器是一种可以从中退出并在之后重新进入的函数。生成器的环境(绑定的变量)会在每次执行后被保存,下次进入时可继续使用。
调用一个生成器函数并不马上执行它的主体,而是返回一个这个生成器函数的迭代器(iterator)对象。当这个迭代器的next()方法被调用时,生成器函数的主体会被执行直至第一个yield表达式,该表达式定义了迭代器返回的值,或者,被 yield*委派至另一个生成器函数。next()方法返回一个对象,该对象有一个value属性,表示产出的值,和一个done属性,表示生成器是否已经产出了它最后的值。

示例

1
2
3
4
5
6
7
8
9
10
11
"use strict"
function* idMaker(){
var index = 0;
while(index<3)
yield index++;
}
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined

co的使用

在开发中,为了方便的使用generator,我们可以使用TJ大神的co库,co其实是帮我们封装了不断调用next的过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"use strict"
const co = require("co");
function sleep(ms){
return function(done){
setTimeout(done, ms)
}
}
co(function* (){
console.log("sleep");
yield sleep(1000)
console.log("sleep");
}).catch(function(e){
})

thunkify的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"use strict"
const fs = require("fs"),
co = require("co"),
thunkify = require("thunkify"),
readfile = thunkify(fs.readFile);
co(function* (){
let content = yield function(done){
fs.readFile("/tmp/test.txt", done)
}
let text = yield readfile("/tmp/test.txt");
console.log(content, text);
}).catch(function(e){
});