现在有一个需求,读取3个本地文件(s1.txt、s2.txt、s3.txt),3条数据全部拿到之后,打印 ("读取成功" + 数据内容) 。
1、最简单最不靠谱的写法
let fs = require('fs');
let returnAry = [];
fs.readFile('s1.txt', 'utf8', function(err, data) {
returnAry.push(data);
if(returnAry.length === 3){
console.log('读取成功:' + returnAry);
}
});
fs.readFile('s2.txt', 'utf8', function(err, data) {
returnAry.push(data);
if(returnAry.length === 3){
console.log('读取成功:' + returnAry);
}
});
fs.readFile('s3.txt', 'utf8', function(err, data) {
returnAry.push(data);
if(returnAry.length === 3){
console.log('读取成功:' + returnAry);
}
});
复制代码
2、代码冗余,优化
let fs = require('fs');
let returnAry = [];
function print(data) {
returnAry.push(data);
if (returnAry.length === 3) {
console.log('读取成功:' + returnAry);
}
}
fs.readFile('s1.txt', 'utf8', function(err, data) {point(data);});
fs.readFile('s2.txt', 'utf8', function(err, data) {point(data);});
fs.readFile('s3.txt', 'utf8', function(err, data) {point(data);});
复制代码
3、扩展性不太好,优化
如果读取的4个本地文件,那么就需要去print函数中修改判断的数字
let fs = require('fs');
let ASYNC_READ_NUM = 3;
/**
* @param {number} times 执行次数
* @param {function} callback 成功后的回调
* @returns {function} function
*/
function _after(times, callback) {
let returnAry = [];
if (typeof callback !== 'function') {
throw new Error('参数错误');
}
return function (data) {
returnAry.push(data);
if (returnAry.length === times) {
callback(returnAry);
}
};
}
let print = _after(ASYNC_READ_NUM, function (data) {
console.log('读取成功:' + data);
});
fs.readFile('s1.txt', 'utf8', function (err, data) {print(data);});
fs.readFile('s2.txt', 'utf8', function (err, data) {print(data);});
fs.readFile('s3.txt', 'utf8', function (err, data) {print(data);});
复制代码
高阶函数
在《javascript设计模式和开发实践》中是这样定义的
- 函数可以作为参数被传递;
- 函数可以作为返回值输出;
回调函数
- 函数A作为参数(地址引用)传递到了函数B中,在函数B中函数A被执行了。
闭包
一个函数内部,return
一个函数出去,而 return
的这个函数就是 “闭包”
闭包的主要用途:可以让外界读取到函数内部的变量。
闭包的问题:主要是内存泄漏,在函数的生命周期结束时,手动释放掉这个引用,设置成 null
即可
附:这篇博客 也许 想表达 (高阶、回调、闭包) 之间我中有你你中有我的亲情 (⊙﹏⊙)b