如今有一個需求,讀取3個本地文件(s1.txt、s2.txt、s3.txt),3條數據所有拿到以後,打印 ("讀取成功" + 數據內容) 。javascript
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);
}
});
複製代碼
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);});
複製代碼
若是讀取的4個本地文件,那麼就須要去print函數中修改判斷的數字java
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設計模式和開發實踐》中是這樣定義的設計模式
一個函數內部,return
一個函數出去,而 return
的這個函數就是 「閉包」閉包
閉包的主要用途:能夠讓外界讀取到函數內部的變量。函數
閉包的問題:主要是內存泄漏,在函數的生命週期結束時,手動釋放掉這個引用,設置成 null
便可優化
附:這篇博客 也許 想表達 (高階、回調、閉包) 之間我中有你你中有個人親情 (⊙﹏⊙)bui