A promise generator is analogous in all ways to a plain generator.
Promise generators implement yield
, return
, and throw
.
The return and throw methods both terminate the stream.
Yield accepts a value.
They all return promises for an acknowledgement iteration from the consumer.
Waiting for this promise to settle causes the producer to idle long enough for
the consumer to process the data.
One can increase the number of promises that can be held in flight by a promise
buffer.
The buffer constructor takes a length
argument that primes the acknowledgement
queue, allowing you to send that number of values before having to wait for the
consumer to flush.
var buffer = new Buffer(1024);
function fibStream(a, b) {
return buffer.in.yield(a)
.then(function () {
return fibStream(b, a + b);
});
}
fibStream(1, 1).done();
return buffer.out;
If the consumer would like to terminate the producer prematurely, it calls the
throw
method on the corresponding promise iterator.
This will eventually propagate back to the promise returned by the generator’s
yield
, return
, or throw
.
buffer.out.throw(new Error("That's enough, thanks"));