回答:
ノード10.17以降、stream.Readableには、from
任意の反復可能オブジェクト(配列リテラルを含む)からストリームを簡単に作成するメソッドがあります。
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")
ごとに1つのイベントを発行します。Readable.from(["input string"])
配列内のアイテムごとに1つのイベント(この場合は1つのアイテム)を発行します。
また、後のノード(おそらく12.3ですが、ドキュメントには関数が変更されたと記載されているため)では、文字列を配列でラップする必要はありません。
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
以下のよう@substackが私を修正#node、新しいストリームAPIノード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.10.26からv9.2.1ではpush
、REPLプロンプトから直接呼び出すと、not implemented
設定しなかった場合は例外でクラッシュし_read
ます。関数またはスクリプト内ではクラッシュしません。緊張しますnoop
。
null
ストリームのバッファにプッシュするのですか?
null
は、すべてのデータの読み取りが終了し、ストリームを閉じることをストリームに
readable.push()
メソッドは、読み取り可能なインプリメンターによってのみ呼び出され、readable._read()
メソッド内からのみ呼び出されることを意図しています。」
Jo Lissの履歴書回答は使用しないでください。それはほとんどの場合に機能しますが、私の場合、それは私に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
これは完全に準拠した読み取り可能なストリームである必要があります。ストリームを適切に使用する方法について詳しくは、こちらをご覧ください。
OLD ANSWER:ネイティブの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
})
'close'イベントは発行されないことに注意してください(これはストリームインターフェイスでは必要ありません)。
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'
別の解決策は、Readableのコンストラクターにread関数を渡すことです(cf doc stream readeable options)
var s = new Readable({read(size) {
this.push("your string here")
this.push(null)
}});
例としてs.pipeを使用した後
これを6か月ごとに再学習する必要があることにうんざりしていたので、実装の詳細を抽象化するnpmモジュールを公開しました。
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
に従って、ストリームに渡される典型的なオプションです。
Travis CIによれば、ほとんどのバージョンのノードと互換性があるはずです。
TypeScriptで整頓されたソリューションを次に示します。
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...')
JavaScriptはダックタイプであるため、読み取り可能なストリームのAPIをコピーするだけで問題なく動作します。実際、おそらくこれらのメソッドのほとんどを実装できないか、単にそれらをスタブのままにしておくことはできません。実装する必要があるのは、ライブラリが使用するものだけです。Nodeの事前に構築されたEventEmitter
クラスを使用してイベントを処理することもできるため、addListener
自分で実装する必要はありません。
CoffeeScriptで実装する方法は次のとおりです。
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が提案するような新しいインスタンスを作成するだけです。