Appearance
异步任务的采集器
fs.readFile 读取文件,产生异步任务
javascript
path.resolve() // 默认 path.resolve() 会根据执行的路径来解析绝对路径
// __dirname 就是当前的目录
console.log(path.resolve(__dirname,'a.txt'))
1
2
3
4
2
3
4
javascript
// 文件系统模块 filesystem
const fs = require('fs')
// 路径模块 进行路径操作
const path = require('fs')
// node 的异步 api 回调的第一个参数 都是 err-firsts
// 异步方法 在处理错误的情况时 必须通过回调参数来处理
fs.readFile(path.resolve(__dirname,'a.txt','utf-8',function (err,data) {
console.log(data)
});
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
例如前端并发 ajax,我们需要等待多个异步请求完成后 将结果拿到渲染页面 同步 异步回调的执行结果
用普通函数采集
javascript
// 假设有两个文件的异步需要拿到
let obj = {} // 将所有的结果做一个采集器
// 通过回调方法将采集器收集
function cb(key,value){
obj[key] = value;
if(Object.key(obj).length === 2){
console.log(2);
}
}
fs.readFile(path.resolve(__dirname,'a.txt','utf-8',function (err,data) {
console.log(data)
obj.msg = data
cb('msg',data)
});
fs.readFile(path.resolve(__dirname,'b.txt','utf-8',function (err,data) {
console.log(data)
obj.age = data
cb('age',data)
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
用闭包的方法实现
javascript
// 假设有两个文件的异步需要拿到
function after(times,cb){
let obj = {}
return function (key,value){
obj[key] = value;
if(--times === 0){
cb(obj)
}
}
}
let cb = after(2,data=>{ // 只有在两次完成后 才能得到结果 但是无法监控中间的过程(发布订阅)
console.log(data);
})
fs.readFile(path.resolve(__dirname,'a.txt','utf-8',function (err,data) {
console.log(data)
obj.msg = data
cb('msg',data)
});
fs.readFile(path.resolve(__dirname,'b.txt','utf-8',function (err,data) {
console.log(data)
obj.age = data
cb('age',data)
});
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
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