2016-04-12 10 views
8

क्या कोई पठनीय स्ट्रीम को Node.js में एक लिखने योग्य स्ट्रीम से कनेक्ट करने का कोई तरीका है, जहां लिखने योग्य डेटा अभी तक प्राप्त करने के लिए तैयार नहीं है? दूसरे शब्दों में, मैं पठनीय के साथ पठनीय कनेक्ट करना चाहता हूं, लेकिन मैं प्रोग्राम में बाद के बिंदु पर लिखने की विधि को परिभाषित करने सहित लिखने योग्य बनाना चाहता हूं। शायद हमें लिखने की विधि को लागू करना होगा, लेकिन क्या एक लिखने योग्य धारा को रोकने के लिए एक तरीका है जिसमें आप एक पठनीय धारा को रोक सकते हैं? या हम लिखने योग्य डेटा को पाइप करने से पहले, हम मध्यवर्ती माध्यम से/ट्रांसफॉर्म स्ट्रीम का उपयोग कर डेटा को बफर कर सकते हैं!डेटा को प्राप्त करने के लिए तैयार नहीं है, जो डेटा प्राप्त करने के लिए तैयार नहीं है

उदाहरण के लिए, सामान्य रूप से हम करते हैं:

readable.pipe(transform).pipe(writable); 

लेकिन मैं की तरह कुछ करना चाहता हूँ:

const tstrm = readable.pipe(transform); 

doSomethingAsync().then(function(){ 

     tstrm.pipe(writable); 

}); 

सिर्फ अगर यह संभव हो सकता है और कैसे यह ठीक है, अब तक हो रही करने के लिए सोच रहा दोनों को समझने में परेशानी।

मुझे लगता है कि मैं एक मध्यस्थ ट्रांसफॉर्म स्ट्रीम में डेटा को बफर करना चाहता हूं, इससे पहले कि यह एक लिखने योग्य स्ट्रीम से कनेक्ट/पाइप हो, और बाद में, कनेक्ट होने के बाद, किसी भी नए डेटा से पहले बफर किए गए डेटा को स्ट्रीम करें। ऐसा करने के लिए एक उचित चीज की तरह लगता है, इस पर कोई जानकारी नहीं मिल सकती है।

+0

स्वीकार किए जाते हैं जवाब की तरह लग रहा है यहाँ मैं http://stackoverflow.com/questions/20317759/implementing-a-buffered-transform-stream –

उत्तर

2

नोट, मैं यहां पढ़ने के लिए सक्षम होने की नकल करने के लिए एक अंतराल का उपयोग कर रहा हूं। अगर लेखक झूठे रिटर्न आप राज्य को अपडेट करेंगे बफरिंग आदि मुझे लगता है कि अंतिम पंक्ति क्या आप यानी चाहते

r.pipe(b).pipe(w); 

इस रूप में

readStrem.pipe(transformBbuffer).pipe(writeStream); 
इस प्रकार पढ़ता है शुरू करने के लिए आप यह किसी भी तरह आप यानी चाहते हैं कर सकते हैं

उदाहरण कोड, कुछ डेटा हैं जो हम सभी डेटा बफर करने के लिए कर सकते हैं। मैं कोड के बाद वर्णन करूंगा। आप जो कुछ भी धाराओं के बारे में पता करने की जरूरत है और अधिक डॉक्स में कर रहे हैं, मुझे लगता है कि वे और अधिक पूर्ण उदाहरण के साथ कर सकता है, लेकिन वे के रूप में बहुत अच्छा कर रहे हैं ...

https://nodejs.org/api/stream.html#stream_class_stream_transform_1

इस कोड।

var fs  = require('fs'); 
var stream = require('stream') 
const util = require('util'); 
//const StringDecoder = require('string_decoder').StringDecoder; 
const Transform = require('stream').Transform; 
var check_buff = 0; 
var DRAIN_ME = 0; 

var r = fs.createReadStream('file1.txt').setEncoding('utf8'); 
var w = fs.createWriteStream('file2.txt'); 

var BufferStream = function() { 
    stream.Transform.apply(this, arguments); 
    this.buffer = []; 
}; 

util.inherits(BufferStream, stream.Transform); 

var intId; 
intId = setInterval(function(){ 
    if(check_buff % 3 == 0) { 
    DRAIN_ME = 1; 
    return; 
    } 
    DRAIN_ME = 0; 
},10); 

BufferStream.prototype._transform = function (chunk, encoding, done) { 
    this.buffer.push(String(chunk)); 
    while(DRAIN_ME > 0 && this.buffer.length > 0) { 
    this.push(this.buffer.shift()); 
    } 
    console.log(chunk.length); 
    console.log(this.buffer.length); 
    done(); 
}; 

var b = new BufferStream(); 
b.on('end', function(chunk) { 
    clearInterval(intId); 
}); 
r.pipe(b).pipe(w); 

मैं एक बदलने लागू करने के लिए विहित तरीका रहा हूँ/ धारा, कि सभी डेटा बफ़र्स जब तक पाइप उस पर कॉल है के माध्यम से।

परीक्षण करने के लिए यह एक बनाने बनाओ निम्न परिवर्तन

BufferStream.prototype._transform = function (chunk, encoding, done) { 
    this.buffer.push(String(chunk)); 

    console.log(chunk.length); 
    console.log(this.buffer.length); 
    done(); 
}; 
...... 
BufferStream.prototype._flush = function (cb) { 
    var len = this.buffer.length; 
    for (var i = 0; i < len; i++) { 
    this.push(this.buffer.shift()); 
    }; 
    cb(); 
}; 

तुम भी पठनीय धारा बीच प्रभावी लिखने योग्य धारा को रोक देगा रोक सकते हैं, क्योंकि यह डेटा यानी प्राप्त करने बंद हो जाता है ... डिस्क पर काफी बड़ी फ़ाइल यानी 100 एमबी या उससे अधिक और इसे चलाएं ...

var fs = require('fs'); 
var readableStream = fs.createReadStream('file1.txt'); 
var writableStream = fs.createWriteStream('file2.txt'); 

readableStream.setEncoding('utf8'); 

readableStream.on('data', function(chunk) { 
    var ready = 0; 
    readableStream.pause(); 
    setInterval(function(){ 
    if(ready == 0) { 
     //console.log('pausing'); 
     readableStream.pause(); 
     ready = 1; 
    } 
    else { 
     //console.log('resuming'); 
     readableStream.resume(); 
     ready = 0; 
    } 
    },100); 
    writableStream.write(chunk); 
}); 

तत्काल विराम का कारण है क्योंकि उस समय तक अंतराल ने 10ms निकाल दिया है, फ़ाइल पहले से ही लिखी जा सकती है। इस पर भिन्नताएं हैं यानी ...

var fs = require('fs'); 
var readableStream = fs.createReadStream('file1.txt'); 
var writableStream = fs.createWriteStream('file2.txt'); 
readableStream.setEncoding('utf8'); 

var ready = 0; 
setInterval(function(){ 
    if(ready == 0) { 
    //console.log('pausing'); 
    readableStream.pause(); 
    ready = 1; 
    } 
    else { 
    //console.log('resuming'); 
    readableStream.resume(); 
    ready = 0; 
    } 
},100); 

readableStream.on('data', function(chunk) { 
    writableStream.write(chunk); 
    readableStream.pause(); 
}); 
+0

धन्यवाद के लिए क्या देख रहा हूँ, हाँ मैं पठनीय रोक सकते हैं के करीब है, यह इतना कठिन नहीं है, लेकिन डेटा प्राप्त करने के लिए लिखने के लिए लिखने के लिए प्रतीक्षा करने के दौरान डेटा को बफर करने के लिए एक थ्रू/ट्रांसफॉर्म स्ट्रीम का उपयोग करने के बारे में क्या? –

संबंधित मुद्दे