-
Notifications
You must be signed in to change notification settings - Fork 0
/
generator-async.html
104 lines (87 loc) · 3.42 KB
/
generator-async.html
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>generator async</title>
</head>
<body>
<script>
// ES6 诞生以前,异步编程的方法
// 回调函数
// 事件监听
// 发布/订阅
// Promise 对象
// 协程有点像函数,又有点像线程。它的运行流程大致如下
// 第一步,协程A开始执行
// 第二步,协程A执行到一半,进入暂停,执行权转移到协程B
// 第三步,(一段时间后)协程B交还执行权
// 第四步,协程A恢复执行
// 整个 Generator 函数就是一个封装的异步任务,或者说是异步任务的容器
// 异步操作需要暂停的地方,都用yield语句注明
// 异步任务的封装
/*var fetch = require('node-fetch');
function* gen(){
var url = 'https://api.github.com/users/github';
var result = yield fetch(url);
console.log(result.bio);
}
var g = gen();
var result = g.next();
result.value.then(function(data){
return data.json();
}).then(function(data){
g.next(data);
});*/
// 虽然 Generator 函数将异步操作表示得很简洁,但是流程管理却不方便(即何时执行第一阶段、何时执行第二阶段)
// 参数的求值策略
// "传值调用"(call by value),即在进入函数体之前,就计算参数的值 C
// “传名调用”(call by name),即直接将参数传入函数体,只在用到它的时候求值 Haskell
// 编译器的“传名调用”实现,往往是将参数放到一个临时函数之中,再将这个临时函数传入函数体
// 这个临时函数就叫做 Thunk 函数
/*function f(m) {
return m * 2;
}
f(x + 5);
// 等同于
var thunk = function () {
return x + 5;
};
function f(thunk) {
return thunk() * 2;*/
// JavaScript 语言是传值调用
// 在 JavaScript 语言中,Thunk 函数替换的不是表达式,而是多参数函数
// 将其替换成一个只接受回调函数作为参数的单参数函数
// 正常版本的readFile(多参数版本)
/*fs.readFile(fileName, callback);
// Thunk版本的readFile(单参数版本)
var Thunk = function (fileName) {
return function (callback) {
return fs.readFile(fileName, callback);
};
};
var readFileThunk = Thunk(fileName);
readFileThunk(callback);*/
// 任何函数,只要参数有回调函数,就能写成 Thunk 函数的形式
/*// ES5版本
var Thunk = function(fn){
return function (){
var args = Array.prototype.slice.call(arguments);
return function (callback){
args.push(callback);
return fn.apply(this, args);
}
};
};
// ES6版本
var Thunk = function(fn) {
return function (...args) {
return function (callback) {
return fn.call(this, ...args, callback);
}
};
};*/
// Thunk-函数的自动流程管理
// co 模块
</script>
</body>
</html>