chunk函数及其应用

2021-06-20 22:18:22 Javascript 大约 1 分钟

# 特点

  • 求值策略:传值调用,传名调用sum(x+1,x+2);
  • thunk函数是传名调用的实现方式之一;
  • 可以实现自动执行Generator函数;

# 应用

需求:顺序的打印下列文件

# 普通方法嵌套

function readFilesByCallback() {
    const fs = require("fs");
    const files = [
        "./1.text",
        "./2.text",
        "./3.text"
    ];
    fs.readFile(files[0], function(err, data) {
        console.log(data.toString());
        fs.readFile(files[1], function(err, data) {
            console.log(data.toString());
            fs.readFile(files[2], function(err, data) {
                console.log(data.toString());
            });
        });
    });
}
// 调用
readFilesByCallback();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ASUS@yaweidediannao MINGW64 ~/Desktop/test
$ node module.js 
text1
text2
text3
1
2
3
4
5

形成了回调地狱;

# 使用Generator函数;

function* readFilesByGenerator() {
    const fs = require("fs");
    const files = [
        "./1.text",
        "./2.text",
        "./3.text"
    ];
    function readFile(filename) {
        fs.readFile(filename, function(err, data) {
            console.log(data.toString());
            f.next(data.toString());
        });
    }
    yield readFile(files[0]);
    yield readFile(files[1]);
    yield readFile(files[2]);
}
// 调用
const f = readFilesByGenerator();

f.next();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ASUS@yaweidediannao MINGW64 ~/Desktop/test
$ node module.js 
text1
text2
text3
1
2
3
4
5

虽然解决了层层的嵌套,但是f.next()的调用耦合在文件读取的回调函数里面了,不好;

# 使用chunk函数

const fs = require("fs");
const Thunk = function(fn) {
  return function(...args) {
    return function(callback) {
      return fn.call(this, ...args, callback);
    };
  };
};
const readFileThunk = Thunk(fs.readFile);

function run(fn) {
  var gen = fn();
  function next(err, data) {
    var result = gen.next(data);
    if (result.done) return;
    result.value(next);
  }
  next();
}

const g = function*() {
  const s1 = yield readFileThunk("./1.text");
  console.log(s1.toString());
  const s2 = yield readFileThunk("./2.text");
  console.log(s2.toString());
  const s3 = yield readFileThunk("./3.text");
  console.log(s3.toString());
};

run(g);
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
ASUS@yaweidediannao MINGW64 ~/Desktop/test
$ node module.js 
text1
text2
text3
1
2
3
4
5
上次编辑于: 2023年7月4日 09:36