Consumption methods
An Exstream flow is lazy by default. To consume a stream we have to call a consumption method. There are many consumption methods that are suitable for various scenarios:
Exstream.values()
Collects all the results of the flow in an array. If the stream is synchronous, it returns the array. If the stream is asynchronous, it returns a Promise that resolves with the array
js
const results = _([1,2,3]).map(x => x * 2).values()
const resultsAsync = await _([1,2,3]).map(async x => x * 2).resolve().values()
Exstream.value()
Same as Exstream.values()
but it returns a single value. It's useful when the last method of the chain is a method like Exstream.reduce
or Exstream.groupBy
that emit a single value:
js
const sum = _([1,2,3]).reduce1((sum, x) => sum + x).value()
Exstream.toPromise()
Same as Exstream.values()
but it always returns a Promise, regardless of the Stream being synchronous or not
js
const results = await _([1,2,3]).map(x => x * 2).toPromise()
Exstream.start()
It just starts the Stream
js
_(1000)
.tap(console.log)
.start()
// will log 1, 2, 3, ... 1000 to the console
Exstream.start()
is often used to build pipelines that acts as a Writable Stream:
js
const mongoWritable = _.pipeline()
.batch(1000)
.map(records => writeToMongo(records))
.resolve()
.start()
_(myRecords).pipe(mongoWritable)
Exstream.each(callback)
It consumes the Stream and it calls the callback function for each value emitted
js
_([1,2,3])
.map(x => x * 2)
.each(x => {
console.log(x)
})
Exstream.toArray(callback)
It collects all the emitted items in an Array and it calls the callback function with that Array:
js
_([1,2,3])
.map(x => x * 2)
.toArray(results => {
console.log(results)
//results is [2,4,6]
})
Exstream.pipe(target)
It pipes the chain to a Node.js Stream
js
_(randomStringGenerator())
.pipe(process.stdout)
WARNING
.pipe(target)
can be used also to pipe our chain to an Exstream pipeline or another Exstream flow. In those cases calling this method is equivalent to call .through
, so the Stream is consumed automatically only if you pass a vanilla Node.js Exstream.