2016-03-12 45 views
1

我想圍繞你怎麼做這件事,因爲你不能只繼承transform,它不似乎像你可以從這個特定的writeable stream繼承。將可寫入的流擴展成變換流?

理想情況下它會是這樣的:

const Writeable = require('Writeable'); 

class Transform extends Writeable { 
    constructor() { 
    super(); 
    } 

    _transform(chunk, encoding) { 

    } 
} 

但我可以告訴大家,將無法正常工作。我試圖繼承的特定可寫流將是tapjs/tap-parser。理想情況下,我可以利用它內部的事件偵聽器來解析TAP輸出。

+0

爲什麼需要擴展解析器?你不能只是實例化一個解析器,只是像正常一樣附加事件監聽器? – mscdex

+0

理想情況下,我想在內部使用'writeable's'事件偵聽器來創建一個可以傳入和傳出的'transform'流。 – Breedly

回答

1

我不知道ES6語法,但這裏是一個傳統的變換流接收TAP輸出和輸出對象描述各種解析的部分:

const Transform = require('stream').Transform; 
const inherits = require('util').inherits; 

const Parser = require('tap-parser'); 

function MyTransform() { 
    const self = this; 
    this._parser = new Parser(); 

    Transform.call(this, { readableObjectMode: true }); 

    this._parser.on('complete', function(results) { 
    self.push({ type: 'complete', results }); 
    }).on('assert', function(assert) { 
    self.push({ type: 'assert', assert }); 
    }).on('comment', function(comment) { 
    self.push({ type: 'comment', comment }); 
    }).on('plan', function(plan) { 
    self.push({ type: 'plan', plan }); 
    }).on('version', function(version) { 
    self.push({ type: 'version', version }); 
    }).on('bailout', function(reason) { 
    self.push({ type: 'bailout', reason }); 
    }).on('extra', function(extra) { 
    self.push({ type: 'extra', extra }); 
    }); 
} 
inherits(MyTransform, Transform); 

MyTransform.prototype._write = function(chunk, encoding, cb) { 
    this._parser.write(chunk, cb); 
}; 
MyTransform.prototype._flush = function(cb) { 
    const self = this; 
    this._parser.end(function() { 
    self.push(null); 
    cb(); 
    }); 
}; 
+0

非常有趣,但我將如何結束處理一個解析器的事件偵聽器內的塊?似乎只依賴_flush。 – Breedly

1

嗯,你寫的可寫,但粘貼代碼對於Transform,不知道你是否犯了一個錯誤,但如果你這樣做的目的是一個隔夜變換的例子。

其中line是您的數據,您可以在將它傳遞前進行播放。

let Transform = require("stream").Transform; 

class awesome_class_name extends Transform 
{ 
    constructor() 
    { 
     super() 
    } 

    _transform (line, encoding, processed) { 

     // 
     // Add the data that came in, to the output stream 
     // 
     this.push(line); 

     // 
     // We let system know that we finished processing the data. 
     // 
     processed(); 

    } 
}