天天看點

ES6 使用 NodeJS 逐行讀取檔案内容

請參考:

ES5 使用 NodeJS 逐行讀取檔案的内容

簡單搭建 ES6 的運作環境

在 ES6 中使用 NodeJS 實作逐行讀取檔案内容,具體代碼實作如下:

先看一下目錄結構:

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