Skip to content
On this page

异步任务的采集器

fs.readFile 读取文件,产生异步任务

javascript
path.resolve() // 默认 path.resolve() 会根据执行的路径来解析绝对路径

// __dirname 就是当前的目录
console.log(path.resolve(__dirname,'a.txt'))
1
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

例如前端并发 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

用闭包的方法实现

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
沪ICP备20006251号-1