<div dir="ltr"><div>> <span style="font-family:arial,sans-serif;font-size:12.727272033691406px">Bacon's equivalent of EventStreamResolver.push() returns Bacon.noMore</span></div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">when it finds that the number of listeners has gone to 0.</span><div>
<br></div>It should also be noted that streams2 in node return `false` from `push()` when the stream is "full". <br><br>Generally returning a value from `push()` as some kind of message to the source to either "pause" or "abort" is a good strategy.</div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Apr 18, 2013 at 4:26 PM, Jason Orendorff <span dir="ltr"><<a href="mailto:jason.orendorff@gmail.com" target="_blank">jason.orendorff@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">(narrowing to the part that seems most productive)<br>
<div class="im"><br>
On Wed, Apr 17, 2013 at 9:11 PM, Tab Atkins Jr. wrote:<br>
> On Wed, Apr 17, 2013 at 5:50 PM, Jason Orendorff wrote:<br>
>> Bacon offers two equivalent ways of unsubscribing.<br>
>><br>
>> 1. Bacon's equivalent of the StreamInit callback returns an<br>
>> unsubscribe function. Each subscriber therefore gets its very own<br>
>> unsubscribe callback.<br>
><br>
> Ah, that's an interesting idea.<br>
><br>
> I'm unsure how each subscriber gets its own unsubscribe callback.  The<br>
> init callback is only called once, and so returns only the single<br>
> value, right?<br>
><br>
> Or is the subscribe callback called every time someone starts<br>
> listening, so the stream can potentially act different to different<br>
> listeners?  That seems like it would be hard to make compatible with a<br>
> multi-listener approach.<br>
<br>
</div>Right. It's not quite per-listener; as in your design, the EventStream<br>
class copes with multiple simultaneous listeners.<br>
<br>
But when the number of listeners on an EventStream goes from 0 to 1,<br>
it calls the subscribe hook; when it goes from 1 to 0, it calls the<br>
unsubscribe hook.<br>
<br>
This is because Bacon turns off all the taps when no one's listening.<br>
Futures are not like that.<br>
<br>
Example:<br>
<br>
    var clock = Bacon.interval(100, "tick");<br>
    clock.take(5).log();<br>
    setTimeout(() => clock.take(5).log(), 2000);<br>
<br>
The call to .log() on line 2 causes .take(5) to have a consumer, so<br>
clock's subscribe hook is called. We log some events; 500 msec later,<br>
.take(5) receives its fifth event, so it's all done. It unsubscribes<br>
itself and floats away.<br>
<br>
clock goes to 0 consumers, so it calls the unsubscribe hook.<br>
<br>
At 2000 msec, clock once again has a downstream consumer, so its<br>
subscribe hook is called a second time.<br>
<div class="im"><br>
>> 2. Additionally, Bacon's equivalent of the EventStreamResolver.push()<br>
>> method can return a special value (Bacon.noMore) that means<br>
>> "unsubscribe me".<br>
><br>
> That just kicks out all the listeners to the stream?  Or does it end<br>
> the stream?  Or do you mean something else, given that you use the<br>
> pronoun "me", which implies it's the *listener* with somehow sends the<br>
> signal?  If the latter, you're confused about the role of a stream<br>
> resolver.<br>
<br>
</div>Bacon's equivalent of EventStreamResolver.push() returns Bacon.noMore<br>
when it finds that the number of listeners has gone to 0.<br>
<br>
This is indeed usually caused by the last listener unsubscribing by<br>
returning Bacon.noMore; and this is the point where I think it'll be<br>
quickest to cut short the discussion and just read some Bacon source<br>
code.<br>
<br>
This is called for every event:<br>
<a href="https://github.com/raimohanska/bacon.js/blob/6318160839d76ed4ce4eceeefe5d0d78b8e45403/src/Bacon.coffee#L777" target="_blank">https://github.com/raimohanska/bacon.js/blob/6318160839d76ed4ce4eceeefe5d0d78b8e45403/src/Bacon.coffee#L777</a><br>

<span class="HOEnZb"><font color="#888888"><br>
-j<br>
</font></span><div class="HOEnZb"><div class="h5">_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</div></div></blockquote></div><br></div>