Generator的一些想法

Generator 看了一下午,想明白了就是一个能存储当前某一刹那状态的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//特殊的函数用*标记
function* fn5(){
var x=1;
while(x) {
yield(x++);
}
}

//定义后,每次next()会再yield之前运行停止,下一次调用就从yield后运行至下一个yield之前

var c = fn5();

console.log(c.next().value); // 1
console.log(c.next().value); // 2
console.log(c.next().value); // 3

可以用这种暂停作为异步的执行,当异步执行时候暂停,等到异步停止后,用next()继续执行

结合之前的Promise,可以在异步中这样执行。

  1. 建立一个Promise,并设定resolve和reject函数
  2. yield停在Promise实例对象前
  3. 实例化yield相关的函数,执行next,然后value中返回的实例化的promise中执行操作

具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

/**
* Generator+ Promise组合
*/
var url = "'http://httpbin.org/get'";


var test = url=> {
return new Promise(function(resolve,reject){
request(
url,
function(err, response, body){
if(!err && response.statusCode == 200) {
resolve(body);
}else {
reject(err);
}
}
);
});
}

var fh7 = function* () {
let result = yield test('http://httpbin.org/get');
}
var e = fh7();
var p = e.next().value;
p.then((data)=>{
console.log(data);
});