जवाबों:
10.17 नोड से, stream.Readable में from
आसानी से किसी भी iterable से स्ट्रीम बनाने के लिए एक विधि है (जिसमें ऐरे शाब्दिक शामिल हैं):
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
ध्यान दें कि कम से कम 10.17 और 12.3 के बीच, एक स्ट्रिंग अपने आप में एक चलने योग्य है, इसलिए Readable.from("input string")
काम करेगा, लेकिन प्रति चरित्र एक घटना का उत्सर्जन करेगा। Readable.from(["input string"])
सरणी में प्रति आइटम एक घटना का उत्सर्जन करेगा (इस मामले में, एक आइटम)।
यह भी ध्यान दें कि बाद के नोड्स में (शायद 12.3, क्योंकि दस्तावेज़ीकरण कहता है कि फ़ंक्शन तब बदल गया था), यह अब एक सरणी में स्ट्रिंग को लपेटने के लिए आवश्यक नहीं है।
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
के रूप में @substack मुझे में सही #node , नई धाराओं एपीआई नोड v10 में यह आसान बनाता है:
const Readable = require('stream').Readable;
const s = new Readable();
s._read = () => {}; // redundant? see update below
s.push('your text here');
s.push(null);
... जिसके बाद आप इसे स्वतंत्र रूप से पाइप कर सकते हैं या अन्यथा इसे अपने इच्छित उपभोक्ता को दे सकते हैं।
यह फिर से शुरू करने वाले वन-लाइनर जितना साफ नहीं है , लेकिन यह अतिरिक्त निर्भरता से बचता है।
( अपडेट: v0.2.2.2 में v9.2.1 के माध्यम से अब तक, push
REPL प्रॉम्प्ट से सीधे कॉल एक not implemented
अपवाद के साथ क्रैश हो जाएगा यदि आपने सेट नहीं किया है _read
। यह फ़ंक्शन या स्क्रिप्ट के अंदर क्रैश नहीं होगा। यदि असंगतता आपको बनाता है। घबराहट, शामिल हैं noop
।)
_read
अंतर्निहित संसाधन से डेटा लाने विधि।"
null
धारा के बफर में क्यों धकेलते हैं ?
null
ने धारा को बताया कि उसने सभी आंकड़ों को पढ़ना और धारा को बंद करना समाप्त कर दिया है
readable.push()
विधि का उद्देश्य केवल पठनीय कार्यान्वयनकर्ताओं द्वारा बुलाया जाना है, और केवल readable._read()
विधि के भीतर से ।"
जो लिस के फिर से शुरू करने वाले उत्तर का उपयोग न करें। यह ज्यादातर मामलों में काम करेगा, लेकिन मेरे मामले में इसने मुझे एक अच्छा 4 या 5 घंटे बग ढूंढने में खो दिया। ऐसा करने के लिए तीसरे पक्ष के मॉड्यूल की आवश्यकता नहीं है।
नई उत्तर :
var Readable = require('stream').Readable
var s = new Readable()
s.push('beep') // the string you want
s.push(null) // indicates end-of-file basically - the end of the stream
यह पूरी तरह से पढ़ने योग्य स्ट्रीम होना चाहिए। स्ट्रीम का सही उपयोग कैसे करें , इसके बारे में अधिक जानकारी के लिए यहां देखें ।
पुराने उत्तर : बस देशी PassThrough धारा का उपयोग करें:
var stream = require("stream")
var a = new stream.PassThrough()
a.write("your string")
a.end()
a.pipe(process.stdout) // piping will work as normal
/*stream.on('data', function(x) {
// using the 'data' event works too
console.log('data '+x)
})*/
/*setTimeout(function() {
// you can even pipe after the scheduler has had time to do other things
a.pipe(process.stdout)
},100)*/
a.on('end', function() {
console.log('ended') // the end event will be called properly
})
ध्यान दें कि 'क्लोज' ईवेंट उत्सर्जित नहीं होता है (जो स्ट्रीम इंटरफेस द्वारा आवश्यक नहीं है)।
बस stream
मॉड्यूल का एक नया उदाहरण बनाएं और इसे अपनी आवश्यकताओं के अनुसार अनुकूलित करें:
var Stream = require('stream');
var stream = new Stream();
stream.pipe = function(dest) {
dest.write('your string');
return dest;
};
stream.pipe(process.stdout); // in this case the terminal, change to ya-csv
या
var Stream = require('stream');
var stream = new Stream();
stream.on('data', function(data) {
process.stdout.write(data); // change process.stdout to ya-csv
});
stream.emit('data', 'this is my string');
pipe()
बहुत कम से कम, गंतव्य स्ट्रीम वापस करना है।
संपादित करें: गार्थ का जवाब शायद बेहतर है।
मेरा पुराना उत्तर पाठ नीचे दिया गया है।
स्ट्रिंग को स्ट्रीम में बदलने के लिए, आप स्ट्रीम के माध्यम से रुके हुए का उपयोग कर सकते हैं :
through().pause().queue('your string').end()
उदाहरण:
var through = require('through')
// Create a paused stream and buffer some data into it:
var stream = through().pause().queue('your string').end()
// Pass stream around:
callback(null, stream)
// Now that a consumer has attached, remember to resume the stream:
stream.resume()
resumer
काफी अच्छा काम किया। धन्यवाद!
इसके लिए एक मॉड्यूल है: https://www.npmjs.com/package/string-to-stream
var str = require('string-to-stream')
str('hi there').pipe(process.stdout) // => 'hi there'
एक अन्य समाधान रीडेबल के निर्माणकर्ता को रीड फंक्शन दे रहा है (cf doc स्ट्रीम पठनीय विकल्प )
var s = new Readable({read(size) {
this.push("your string here")
this.push(null)
}});
आप छूट के लिए s.pipe का उपयोग कर सकते हैं
मैं इसे हर छह महीने में फिर से सीखने के लिए थक गया, इसलिए मैंने कार्यान्वयन विवरणों को दूर करने के लिए सिर्फ एक एनपीएम मॉड्यूल प्रकाशित किया:
https://www.npmjs.com/package/streamify-string
यह मॉड्यूल का मूल है:
const Readable = require('stream').Readable;
const util = require('util');
function Streamify(str, options) {
if (! (this instanceof Streamify)) {
return new Streamify(str, options);
}
Readable.call(this, options);
this.str = str;
}
util.inherits(Streamify, Readable);
Streamify.prototype._read = function (size) {
var chunk = this.str.slice(0, size);
if (chunk) {
this.str = this.str.slice(size);
this.push(chunk);
}
else {
this.push(null);
}
};
module.exports = Streamify;
str
यह है string
कि इनवोकेशन पर कंस्ट्रक्टर को पास किया जाना चाहिए, और डेटा के रूप में स्ट्रीम द्वारा आउटपुट किया जाएगा। options
वे विशिष्ट विकल्प हैं, जिन्हें प्रलेखन के अनुसार एक धारा में पारित किया जा सकता है ।
ट्रैविस सीआई के अनुसार, यह नोड के अधिकांश संस्करणों के साथ संगत होना चाहिए।
टाइपस्क्रिप्ट में एक साफ समाधान का उपयोग करता है:
import { Readable } from 'stream'
class ReadableString extends Readable {
private sent = false
constructor(
private str: string
) {
super();
}
_read() {
if (!this.sent) {
this.push(Buffer.from(this.str));
this.sent = true
}
else {
this.push(null)
}
}
}
const stringStream = new ReadableString('string to be streamed...')
जावास्क्रिप्ट को डक-टाइप किया गया है, इसलिए यदि आप केवल पढ़ने योग्य स्ट्रीम के एपीआई की नकल करते हैं, तो यह ठीक काम करेगा। वास्तव में, आप शायद उन तरीकों को लागू नहीं कर सकते हैं या केवल उन्हें स्टब्स के रूप में छोड़ सकते हैं; आप सभी को लागू करने की आवश्यकता है जो पुस्तकालय का उपयोग करता है। आप नोड के पूर्व-निर्मित का उपयोग कर सकते हैंEventEmitter
घटनाओं से निपटने के वर्ग , इसलिए आपको इसे लागू करने की आवश्यकता नहीं है addListener
और ऐसे अपने आप को।
यहाँ आप इसे कॉफीस्क्रिप्ट में कैसे लागू कर सकते हैं:
class StringStream extends require('events').EventEmitter
constructor: (@string) -> super()
readable: true
writable: false
setEncoding: -> throw 'not implemented'
pause: -> # nothing to do
resume: -> # nothing to do
destroy: -> # nothing to do
pipe: -> throw 'not implemented'
send: ->
@emit 'data', @string
@emit 'end'
तो आप इसे इस तरह से उपयोग कर सकते हैं:
stream = new StringStream someString
doSomethingWith stream
stream.send()
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
जब मैं इसका उपयोग करता हूंnew StringStream(str).send()
stream.Readable
@Garth Kidd की तरह एक नया उदाहरण बनाने का सुझाव दिया।
stream.Readable
मौजूद नहीं था ।