<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>>> OK, now you're adding syntax, great! How do you match types? `instanceof` is utterly unreliable, because it doesn't work cross-realm, so a number of us on the committee would block on that.<o:p></o:p></p><p class=MsoNormal>>> OK, now you're adding a cross-realm brand-checking mechanism. There's committee members who would block on that.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’ve fixed that (cross-realms) with GUUIDs and a decent type subsystem.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b>From:</b> Jordan Harband [mailto:ljharb@gmail.com] <br><b>Sent:</b> Wednesday, October 11, 2017 4:06 PM<br><b>To:</b> Christopher Thorn <morphcham@gmail.com><br><b>Cc:</b> es-discuss <es-discuss@mozilla.org><br><b>Subject:</b> Re: Re: Filtered Promise#catch<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>Here's why catch guards aren't an easy feature: Promise catch mirrors syntactic catch. Promise .catch will not get any new features that aren't simultaneously available to syntactic catch - full stop.<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>OK, now you're adding syntax, great! How do you match types? `instanceof` is utterly unreliable, because it doesn't work cross-realm, so a number of us on the committee would block on that.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>OK, now you're adding a cross-realm brand-checking mechanism. There's committee members who would block on that.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>OK, maybe now you're adding a generic matching protocol, because what if you want users to be able to supply more complex guard checks - oh wait, there's already a proposal for that: <a href="https://github.com/tc39/proposal-pattern-matching">https://github.com/tc39/proposal-pattern-matching</a><o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Please do not assume that any given fun idea, given all the edge cases, constraints, and interoperability requirements, will be "easy" to add.<o:p></o:p></p></div></div><div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>On Wed, Oct 11, 2017 at 7:52 AM, Christopher Thorn <<a href="mailto:morphcham@gmail.com" target="_blank">morphcham@gmail.com</a>> wrote:<o:p></o:p></p><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><p class=MsoNormal>Inline<br><br>> If you're going to distinguish between "ergonomic" and "easy" in the context<br>> of JavaScript development, you're going to have to define what you think the<br>> difference is.<br><br>The difference is that it seemed like people thought I meant "this is<br>easy to implement", but I was talking about the ergonomics of using<br>the functions once they're defined. Or trying to, at least :)<br><br>> For something that should, imo, be used in almost every case that `catch` is<br>> used, I don't think that it just being ergonomic to create your own helper<br>> functions is enough. Are you going to create your own helper function like<br>> that for every error type across every file?<br><br>In the codebase I am currently working on, I have functions like these<br>defined in modules, which I import where they are needed.<br><br>> Do you want the developer to provide their own `guard` etc helper functions<br>> like you did? Why should they have to?<br><br>They could be defined by a library, but they don't need to be methods<br>the Promise prototype.<br><br>I prefer separate functions because of their explicit intent. In<br>particular, I'm not a huge fan of bluebird's overloaded `catch`<br>method. However, if you don't overload it, it seems like you'd need to<br>specify three methods in addition to catch: `catchInstancesOf`, one<br>for function predicates, and one for object predicates (I'm not sure<br>what I'd call those two). Having four methods for handling rejections<br>is too many.<br><br>Maybe functions like the ones I demonstrated could be added to the<br>standard library (say, as static properties of the Promise object).<br><br>Regards,<br>Chris<o:p></o:p></p><div><div><p class=MsoNormal><br>On Wed, Oct 11, 2017 at 7:14 AM, Peter Jaszkowiak <<a href="mailto:p.jaszkow@gmail.com">p.jaszkow@gmail.com</a>> wrote:<br>> If you're going to distinguish between "ergonomic" and "easy" in the context<br>> of JavaScript development, you're going to have to define what you think the<br>> difference is.<br>><br>> For something that should, imo, be used in almost every case that `catch` is<br>> used, I don't think that it just being ergonomic to create your own helper<br>> functions is enough. Are you going to create your own helper function like<br>> that for every error type across every file?<br>><br>> Do you want the developer to provide their own `guard` etc helper functions<br>> like you did? Why should they have to?<br>><br>> As I said before, I think the criticism of overloading is fine. However,<br>> this is something more useful than `Array#includes` and already in use more<br>> often than that Array method.<br>><br>> We can use different method names to separate different types of guards if<br>> you feel like it's a preferable idea. However, it definitely needs to be<br>> done because there is significant demand demonstrated by many people still<br>> using bluebird for these utility functions.<br>><br>> On Oct 11, 2017 7:06 AM, "Christopher Thorn" <<a href="mailto:morphcham@gmail.com">morphcham@gmail.com</a>> wrote:<br>>><br>>> I don't think it's pedantic to point out that you're misstating my<br>>> argument. I didn't say "easy", I said "ergonomic", after all.<br>>><br>>> I've used bluebird quite a lot, and I've also used native promises and<br>>> other promise libraries without filtered catch. At first, I missed<br>>> this feature from bluebird, but I no longer do.<br>>><br>>> Personally, I prefer the ergonomics of helper functions like I<br>>> demonstrated to an overloaded `catch` method, especially one which<br>>> does different things depending on the types of the arguments that are<br>>> passed (one behavior for the instanceof check, another for a function<br>>> predicate and another for an object predicate). Using an separate<br>>> function gives the user a chance to specify exactly the behavior they<br>>> want, no more and no less, and gives the user a chance to name the<br>>> filter.<br>>><br>>> Regards,<br>>> Chris<br>>><br>>> On Wed, Oct 11, 2017 at 5:28 AM, Michał Wadas <<a href="mailto:michalwadas@gmail.com">michalwadas@gmail.com</a>><br>>> wrote:<br>>> > I don't get why argument "it's easy to implement in user land" is<br>>> > raised.<br>>> ><br>>> > All Array methods are easy to implement in user land. Including recent<br>>> > additions like .includes and ES2015 methods.<br>>> ><br>>> > Promises are easy to implement in user land. Smallest implementation is<br>>> > less<br>>> > than 1kB AFAIR.<br>>> ><br>>> > Maps, Sets, WeakSets are trivial to implement in user land if WeakMap is<br>>> > present. Probably less than 50 lines of code.<br>>> ><br>>> > Object.values, Object.entries, Object.assign,<br>>> > Object.getOwnPropertyDescriptors, Object.is, Array.from, Array.of. These<br>>> > methods were added recently but they can be implemented in user land.<br>>> ><br>>> > On 11 Oct 2017 2:28 am, "Christopher Thorn" <<a href="mailto:morphcham@gmail.com">morphcham@gmail.com</a>> wrote:<br>>> >><br>>> >> I agree that catch guards are useful, but they can be implemented in<br>>> >> userland fairly ergonomically:<br>>> >><br>>> >> ```<br>>> >> function guard(predicate, callback) {<br>>> >>   return function guarded(reason) {<br>>> >>     if (!predicate(reason)) {<br>>> >>       throw reason;<br>>> >>     }<br>>> >>     return callback(reason);<br>>> >>   };<br>>> >> }<br>>> >><br>>> >> function instanceOf(constructor, callback) {<br>>> >>   return guard(reason => reason instanceof constructor, callback);<br>>> >> }<br>>> >><br>>> >> Promise.resolve('invalid')<br>>> >>   .then(JSON.parse)<br>>> >>   .catch(instanceOf(SyntaxError, reason => {<br>>> >>     // do something to handle the syntax error, or perhaps just silence<br>>> >> it<br>>> >>   }));<br>>> >> ```<br>>> >><br>>> >> Regards, Chris<br>>> >> _______________________________________________<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>>> _______________________________________________<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>><br>><br>> _______________________________________________<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>><br>_______________________________________________<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><o:p></o:p></p></div></div></blockquote></div><p class=MsoNormal><o:p> </o:p></p></div></div><div id="DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><br />
<table style="border-top: 1px solid #D3D4DE;">
        <tr>
        <td style="width: 55px; padding-top: 13px;"><a href="http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient" target="_blank"><img src="https://ipmcdn.avast.com/images/icons/icon-envelope-tick-green-avg-v1.png" alt=""  width="46" height="29" style="width: 46px; height: 29px;" /></a></td>
                <td style="width: 470px; padding-top: 12px; color: #41424e; font-size: 13px; font-family: Arial, Helvetica, sans-serif; line-height: 18px;">Virus-free. <a href="http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient" target="_blank" style="color: #4453ea;">www.avg.com</a>
                </td>
        </tr>
</table><a href="#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width="1" height="1"> </a></div></body></html>