Jawaban:
Dari node 10.17, stream.Readable memiliki from
metode untuk dengan mudah membuat stream dari setiap iterable (yang mencakup array literal):
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
Perhatikan bahwa setidaknya antara 10,17 dan 12,3, string itu sendiri merupakan iterable, jadi Readable.from("input string")
akan berfungsi, tetapi memancarkan satu peristiwa per karakter. Readable.from(["input string"])
akan memancarkan satu peristiwa per item dalam array (dalam hal ini, satu item).
Perhatikan juga bahwa pada node-node yang lebih baru (mungkin 12.3, karena dokumentasi mengatakan bahwa fungsi diubah kemudian), tidak perlu lagi membungkus string dalam sebuah array.
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
Ketika @substack mengoreksi saya di #node , API aliran baru di Node v10 membuat ini lebih mudah:
const Readable = require('stream').Readable;
const s = new Readable();
s._read = () => {}; // redundant? see update below
s.push('your text here');
s.push(null);
... setelah itu kamu bisa bebas pipa atau memberikannya kepada konsumen yang Anda tuju.
Ini tidak sebersih resumer one-liner, tetapi tidak menghindari ketergantungan ekstra.
( Pembaruan: di v0.10.26 hingga v9.2.1 sejauh ini, panggilan push
langsung dari prompt REPL akan macet dengan not implemented
pengecualian jika Anda tidak mengatur _read
. Itu tidak akan crash di dalam suatu fungsi atau skrip. Jika inkonsistensi membuat Anda gugup, termasuk noop
.)
_read
metode untuk mengambil data dari sumber daya yang mendasarinya."
null
ke buffer aliran?
null
memberitahu stream bahwa ia telah selesai membaca semua data dan untuk menutup stream
readable.push()
Metode ini dimaksudkan hanya dipanggil oleh Pelaksana yang Dapat Dibaca, dan hanya dari dalam readable._read()
metode."
Jangan gunakan jawaban pelanggan Jo Liss. Ini akan berfungsi dalam kebanyakan kasus, tetapi dalam kasus saya kehilangan saya menemukan bug yang baik 4 atau 5 jam. Tidak perlu modul pihak ketiga untuk melakukan ini.
JAWABAN BARU :
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
Ini harus menjadi aliran yang Dapat Dibaca sepenuhnya sesuai. Lihat di sini untuk info lebih lanjut tentang cara menggunakan stream dengan benar.
JAWABAN TUA : Cukup gunakan aliran PassThrough asli:
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
})
Perhatikan bahwa acara 'tutup' tidak dipancarkan (yang tidak diperlukan oleh antarmuka aliran).
Cukup buat instance baru dari stream
modul dan sesuaikan dengan kebutuhan Anda:
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
atau
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()
seharusnya mengembalikan aliran tujuan, setidaknya.
Sunting: Jawaban Garth mungkin lebih baik.
Teks jawaban lama saya disimpan di bawah ini.
Untuk mengkonversi string ke sungai, Anda dapat menggunakan berhenti melalui aliran:
through().pause().queue('your string').end()
Contoh:
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
bekerja dengan cukup baik. Terima kasih!
Ada modul untuk itu: https://www.npmjs.com/package/string-to-stream
var str = require('string-to-stream')
str('hi there').pipe(process.stdout) // => 'hi there'
Solusi lain adalah meneruskan fungsi baca ke konstruktor yang Dapat Dibaca (cf doc stream readeable options )
var s = new Readable({read(size) {
this.push("your string here")
this.push(null)
}});
Anda bisa setelah menggunakan s.pipe untuk contoh
Saya bosan harus mempelajarinya kembali setiap enam bulan, jadi saya baru saja menerbitkan modul npm untuk meringkas detail implementasi:
https://www.npmjs.com/package/streamify-string
Ini adalah inti dari modul:
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
adalah string
yang harus diteruskan ke konstruktor setelah invokasi, dan akan dikeluarkan oleh aliran sebagai data. options
adalah opsi khas yang dapat diteruskan ke aliran, per dokumentasi .
Menurut Travis CI, itu harus kompatibel dengan sebagian besar versi node.
Inilah solusi yang rapi dalam 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 bertipe bebek, jadi jika Anda hanya menyalin API aliran yang dapat dibaca , itu akan bekerja dengan baik. Faktanya, Anda mungkin tidak dapat mengimplementasikan sebagian besar metode tersebut atau membiarkannya saja; yang Anda perlukan untuk mengimplementasikan adalah apa yang digunakan perpustakaan. Anda dapat menggunakan EventEmitter
kelas pra-bangun Node untuk menangani acara juga, jadi Anda tidak harus mengimplementasikannyaaddListener
dan melakukannya sendiri.
Inilah cara Anda menerapkannya di 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'
Maka Anda bisa menggunakannya seperti ini:
stream = new StringStream someString
doSomethingWith stream
stream.send()
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
ketika saya menggunakannya sepertinew StringStream(str).send()
stream.Readable
seperti @Garth Kidd yang disarankan.