<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1256">
<style data-externalstyle="true"><!--
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
}

p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst, p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle, p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
line-height:115%;
}
--></style><style><!--
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
}

p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst, p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle, p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
line-height:115%;
}


--></style>
</head>
<body>
<div data-externalstyle="false" dir="ltr" style="font-family:Calibri,'Segoe UI',Meiryo,'Microsoft YaHei UI','Microsoft JhengHei UI','Malgun Gothic','Khmer UI','Nirmala UI',Tunga,'Lao UI',Ebrima,sans-serif;font-size:12pt;">
<div>My apologies, I've seen three use cases. The third use case being the ability to send progress notifications.</div>
<div data-signatureblock="true">
<div> </div>
<div>Sent from Windows Mail</div>
<div> </div>
</div>
<div style="padding-top: 5px; border-top-color: rgb(229, 229, 229); border-top-width: 1px; border-top-style: solid;">
<div><font face="Calibri, 'Segoe UI', Meiryo, 'Microsoft YaHei UI', 'Microsoft JhengHei UI', 'Malgun Gothic', 'Khmer UI', 'Nirmala UI', Tunga, 'Lao UI', Ebrima, sans-serif" style="line-height: 15pt; letter-spacing: 0.02em; font-family: Calibri, "Segoe UI", Meiryo, "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Khmer UI", "Nirmala UI", Tunga, "Lao UI", Ebrima, sans-serif; font-size: 11pt;"><b>From:</b> Ron
 Buckton<br>
<b>Sent:</b> ıMondayı, ıMayı ı27ı, ı2013 ı12ı:ı47ı ıPM<br>
<b>To:</b> Andreas Rossberg, Tom Van Cutsem<br>
<b>Cc:</b> Mark S. Miller, Brendan Eich, es-discuss</font></div>
</div>
<div> </div>
<div style="font-family: Calibri,"Segoe UI",Meiryo,"Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Khmer UI","Nirmala UI",Tunga,"Lao UI",Ebrima,sans-serif; font-size: 12pt;" dir="ltr">
<div>Are there a fixed number of use cases for promise subclasses? I’ve seen discussions about two possibilities referred to on this list, specifically a lazy-promise and a cancellable promise. I wonder if these two capabilities should instead be part of the
 Promise/Future API and not have subclasses promises. High-order operations like Q.all/Future.every will cause the subclass to be lost to the resulting operation.</div>
<div> </div>
<div>I do agree with the earlier discussion that adding a cancel method to a promise can expose too much to the consumer, allowing multiple consumers of the same promise the ability to cancel the root. I have been experimenting [1] with supplying a cancellation
 signal from outside the promise that can be provided to the various API’s (as an optional argument to the constructor and to then/done) to allow for cancellation but respect the separation of responsibilities between a promise and its creator. This makes cancellation
 optional, but fully baked into the API, as well as allowing the promise to fully cooperate with cancellation internally.
</div>
<div> </div>
<div>In a similar way we could enable lazy initialization of the promise via an argument to the constructor. Are there other use cases for promise subclasses?</div>
<div> </div>
<div>Not subclassing promise doesn't prevent it from being a first-class object, just as how today you can’t subclass Function, yet functions are first class.</div>
<div> </div>
<div>Ron</div>
<div> </div>
<div>[1] <a title="http://github.com/rbuckton/promisejs" href="http://github.com/rbuckton/promisejs" target="_parent">
http://github.com/rbuckton/promisejs</a></div>
<div> </div>
<div>Note: this is roughly based off of the DOM Futures spec with some non-spec additions, and performs auto-lift and single unwrap as discussed in an earlier thread.</div>
<div>
<div> </div>
<div>Sent from Windows Mail</div>
<div> </div>
</div>
<div style="padding-top: 5px; border-top-color: rgb(229, 229, 229); border-top-width: 1px; border-top-style: solid;">
<div><font face="Calibri, 'Segoe UI', Meiryo, 'Microsoft YaHei UI', 'Microsoft JhengHei UI', 'Malgun Gothic', 'Khmer UI', 'Nirmala UI', Tunga, 'Lao UI', Ebrima, sans-serif" style="line-height: 15pt; letter-spacing: 0.02em; font-family: Calibri,"Segoe UI",Meiryo,"Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Khmer UI","Nirmala UI",Tunga,"Lao UI",Ebrima,sans-serif; font-size: 11pt;"><b>From:</b> Tom
 Van Cutsem<br>
<b>Sent:</b> ıMondayı, ıMayı ı27ı, ı2013 ı8ı:ı09ı ıAM<br>
<b>To:</b> Andreas Rossberg<br>
<b>Cc:</b> Mark S. Miller, Brendan Eich, es-discuss</font></div>
</div>
<div> </div>
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">2013/5/27 Andreas Rossberg <span dir="ltr"><<a title="mailto:rossberg@google.com" href="mailto:rossberg@google.com" target="_parent">rossberg@google.com</a>></span><br>
<blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;">
<div class="im">On 27 May 2013 15:30, Tom Van Cutsem <<a title="mailto:tomvc.be@gmail.com" href="mailto:tomvc.be@gmail.com" target="_parent">tomvc.be@gmail.com</a>> wr<br>
> What the discussion at last week's TC39 meeting clarified for me is the<br>
> following:<br>
><br>
> - Promises are primarily a control-flow abstraction.<br>
> - Sometimes, they are also used as a data-abstraction (i.e. as a container<br>
> in their own right, wrapping an arbitrary payload).<br>
> - All of the subtle problems discussed in these threads only start to arise<br>
> when these two use cases of promises are being mixed, e.g. a<br>
> promise-as-data-container being mistaken for a<br>
> promise-as-control-abstraction. This rarely happens in application code, but<br>
> may happen in generic library code.<br>
<br>
</div>
Well, the gist of higher-order languages is that control flow<br>
abstractions _are_ data. For example, that's the defining<br>
characteristics of first-class functions. And while most functions<br>
won't be used in a first-class manner (and most programmers probably<br>
don't think about them that way), the ability to do so gives great<br>
power -- as JavaScript demonstrates very well.<br>
<br>
Futures/promises are an abstraction for first-class synchronisation.<br>
For the same reason you sometimes want to store or pass back & forth<br>
functions, you will sometimes want to store or pass promises. Not<br>
being able to combine those abstractions freely and transparently<br>
would arbitrarily limit their power, and practically demote promises<br>
to second-class status.<br>
</blockquote>
<div><br>
</div>
<div>I agree with everything you said, but I fail to see why Q-style promises would become second-class. I have enjoyed writing and working with higher-order combinators like Q.all, which creates a promise for an array of promises. Your text above would seem
 to imply that writing or using such combinators would somehow be hampered by the recursive flattening, but I have never bumped into this issue. I think the reason is that when promises are used as data in combinators like Q.all, the composite abstraction as
 a whole remains a control-flow abstraction.</div>
<div><br>
</div>
<div>Cheers,</div>
<div>Tom</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>