Is it correct to assume that a Readable won't emit the "readable" event
until you're registered for it?

Reading through the streams2 docs, I was under the impression that all
streams start out paused and don't start emitting data until you add either
a "data" (for old streams) or a "readable" listener. For new streams, this
should mean that they don't emit "readable" until at least one listener is
registered. Otherwise we still need to do some buffering in order to
capture all the data.

For example, this code misses the readable event on node 0.10:

    var http = require('http');

    http.get('http://www.google.com', function (response) {
      console.log('got response with status ' + response.statusCode);

      setTimeout(function () {
        response.on('readable', function () {
          console.log('readable');
        });

        response.on('end', function () {
          console.log('end');
        });
      }, 5);
    });

Here's my shell session:

$ node -v
v0.10.0
$ node http-test.js
got response with status 200
$

Is this the correct behavior?

--
Michael Jackson
@mjackson


On Thu, Mar 21, 2013 at 4:27 PM, Isaac Schlueter <[email protected]> wrote:

> re old-mode
>
> Yes, that's fine.  If you just want to get all the data asap, use
> on('data', handler).  It'll work great, and it's still very fast.
> pause()/resume(), the whole bit.  (The difference is that it won't
> emit data until you're listening, and pause() will *actually* pause.)
>
>
> Re read(cb)
>
> It's problematic for reasons that I've discussed all of the places
> where it's been brought up.  That horse is dead, let's stop beating
> it.  (There were a few other proposals as well, btw.  Reducibles and
> some other monadic approaches come to mind.)
>
>
> Re pipe() vs looping around read() vs custom Writable vs on('data')
>
> Whatever works for your case is fine.  It's flexible on purpose, and
> allows more types of consumption than streams1, and creating custom
> writables is easier than it was in streams1.
>
> If you find something that the API can't do for you, or find yourself
> doing a lot of backflips or overriding a lot of methods to get your
> stuff working, then let's chat about it in a github issue.  You might
> be missing something, or you might have found a genuine shortcoming in
> the API.
>
>
>
> On Thu, Mar 21, 2013 at 2:01 PM, Sigurgeir Jonsson
> <[email protected]> wrote:
> > Thanks for all the answers. I almost forgot to look back at this thread
> as
> > the custom writeStreams have exceeded the high expectation I had already
> for
> > Streams 2.
> > For me, the reference manual was a little confusing, as there are
> complete
> > examples on using the read method, no mention of  "reading" through a
> > writeStream endpoint.
> >
> > Marco, I agree that that read has more detailed control of minimum
> incoming
> > content.  However I wonder if it would be more efficient to default
> > pipe.chunkSize to a "lowWatermark" of the receiver (if defined).   This
> > lowWatermark could be adjusted dynamically and the callback in the
> writable
> > should keep sequence of events under control?
> >
> > Anyway, thanks Node team, I'm very impressed!
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > On Wednesday, March 20, 2013 4:45:32 AM UTC-4, Marco Rogers wrote:
> >>
> >> @Nathan's response is right. Creating a writable stream is preferable in
> >> most cases. But I wanted to add a little context to that. If you're
> dealing
> >> with a base readable stream, it's just pushing chunks of data at you
> off the
> >> wire. Your first task is to collect those chunks into meaningful data.
> So
> >> IMO the reason creating a writable stream is preferable is because it
> >> prompts you not just read off the stream, but to create semantics around
> >> what the new stream is supposed to be. The api reflects this opinion and
> >> that's why creating writable streams feels like the more natural way,
> and
> >> the ugliness of dealing with read() is wrapped up in the pipe() method.
> It
> >> was kind of designed that way.
> >>
> >> But the read() api was also designed for a use case. It's meant to
> handle
> >> low/high water marks effectively, as well as enable more optimized
> special
> >> parsing by reading off specific lengths of chunks. These were things
> that
> >> people kept needing, but the old api didn't support well. If you were
> >> writing a library for a special parser, you might write a custom
> Writable
> >> stream and inside it you would be using the read(n) api to control
> *how* you
> >> read data off the socket. I hope that makes sense.
> >>
> >> :Marco
> >>
> >> On Monday, March 18, 2013 11:06:48 AM UTC-7, Sigurgeir Jonsson wrote:
> >>>
> >>> The new streams have excellent support for high/low watermarks and
> >>> auto-pausing/resuming, but the documentation confuses me a little...
> >>> particularly the read method.
> >>>
> >>> When I read the new docs for the first time I was under the impression
> >>> that the optimal way to become a user of a stream is to write loops
> around
> >>> the read functio.  However in practice I find myself simply writing
> custom
> >>> writeStreams and use the callback to control upstream pressure (in
> addition
> >>> to source Watermarks if needed).   Here is an example where I move the
> >>> output to a queue that executes a custom function in parallel (i.e.
> >>> uploading to a database)    https://gist.github.com/ZJONSSON/5189249
> >>>
> >>> Are there any benefits to using the read method directly on a stream
> vs.
> >>> piping to a custom Writable stream?
> >
> > --
> > --
> > Job Board: http://jobs.nodejs.org/
> > Posting guidelines:
> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> > You received this message because you are subscribed to the Google
> > Groups "nodejs" group.
> > To post to this group, send email to [email protected]
> > To unsubscribe from this group, send email to
> > [email protected]
> > For more options, visit this group at
> > http://groups.google.com/group/nodejs?hl=en?hl=en
> >
> > ---
> > You received this message because you are subscribed to the Google Groups
> > "nodejs" group.
> > To unsubscribe from this group and stop receiving emails from it, send an
> > email to [email protected].
> > For more options, visit https://groups.google.com/groups/opt_out.
> >
> >
>
> --
> --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en
>
> ---
> You received this message because you are subscribed to the Google Groups
> "nodejs" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to