請參考:
ES5 使用 NodeJS 逐行讀取檔案的内容
簡單搭建 ES6 的運作環境
在 ES6 中使用 NodeJS 實作逐行讀取檔案内容,具體代碼實作如下:
先看一下目錄結構:
//ObserverMode.js
const queuedObservers = new Set();
const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {set});
function set(target, key, value, receiver) {
const result = Reflect.set(target, key, value, receiver);
queuedObservers.forEach(observer => observer());
return result;
}
const person = observable({
name: '張三',
age: 20
});
function print() {
console.log(`${person.name}, ${person.age}`)
}
observe(print);
person.name = '李四';
//readFileByLine.js
import fs from "fs";
import readLine from "readline";
const init = Symbol("init");
const readObj = Symbol("readObj");
class ReadFileByLine {
constructor(file) {
this.file = file;
}
read(cb) {
this[init]();
this[readObj].on("line", cb);
this[readObj].on("close", () => {
console.log("readLine closed ....");
});
}
//私有方法
[init]() {
//私有變量
this[readObj] = readLine.createInterface({
input: fs.createReadStream(this.file)
});
}
}
export default ReadFileByLine;
測試代碼如下:
//readMyFile.js
import ReadFileByLine from "./readFileByLine";
const readFileByLine = new ReadFileByLine("ObserverMode.js");
let idx = 0;
readFileByLine.read((line) => {
var out = "line_" + idx + ": " + line.toString();
console.log(out);
});
通過使用 babel 将 ES6 轉碼成 ES5 之後,就可以正常運作了。
轉碼之後的代碼如下:
//readFileByLine.js
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _fs = require("fs");
var _fs2 = _interopRequireDefault(_fs);
var _readline = require("readline");
var _readline2 = _interopRequireDefault(_readline);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var init = Symbol("init");
var readObj = Symbol("readObj");
var ReadFileByLine = function () {
function ReadFileByLine(file) {
_classCallCheck(this, ReadFileByLine);
this.file = file;
}
_createClass(ReadFileByLine, [{
key: "read",
value: function read(cb) {
this[init]();
this[readObj].on("line", cb);
this[readObj].on("close", function () {
console.log("readLine closed ....");
});
}
//私有方法
}, {
key: init,
value: function value() {
//私有變量
this[readObj] = _readline2.default.createInterface({
input: _fs2.default.createReadStream(this.file)
});
}
}]);
return ReadFileByLine;
}();
exports.default = ReadFileByLine;
//readMyFile.js
"use strict";
var _readFileByLine = require("./readFileByLine");
var _readFileByLine2 = _interopRequireDefault(_readFileByLine);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var readFileByLine = new _readFileByLine2.default("ObserverMode.js");
var idx = 0;
readFileByLine.read(function (line) {
var out = "line_" + idx + ": " + line.toString();
console.log(out);
});
測試結果如下:
"D:\software\WebStorm 2017.2.4\bin\runnerw.exe" "D:\Program Files\nodejs\node.exe" D:\Workspaces\Webstorm\web\javascript\ES6\out\readMyFile.js
line_0: 'use strict';
line_0:
line_0: var queuedObservers = new Set();
line_0:
line_0: var observe = function observe(fn) {
line_0: return queuedObservers.add(fn);
line_0: };
line_0: var observable = function observable(obj) {
line_0: return new Proxy(obj, { set: set });
line_0: };
line_0:
line_0: function set(target, key, value, receiver) {
line_0: var result = Reflect.set(target, key, value, receiver);
line_0: queuedObservers.forEach(function (observer) {
line_0: return observer();
line_0: });
line_0: return result;
line_0: }
line_0:
line_0: var person = observable({
line_0: name: '張三',
line_0: age: 20
line_0: });
line_0:
line_0: function print() {
line_0: console.log(person.name + ', ' + person.age);
line_0: }
line_0:
line_0: observe(print);
line_0: person.name = '李四';
readLine closed ....
Process finished with exit code 0