

Show HN: And then... - aravindet
https://github.com/askabt/andthen

======
dbaupp
There seems to be a large number of new users (a few of which were created
within 5 minutes of this submission) who've only commented on this, and very
vacuously.

~~~
aravindet
This went out on FB and Twitter. I guess people who came from there weren't HN
users. Hopefully they are now.

I agree about the comment quality though, I was hoping for a discussion about
the idea itself.

~~~
blowski
The idea is good, but I can't see why I would switch to this from Q.js. The
latter is:

* pretty lightweight (9.8KB)

* well-supported, with very active development (10 commits in the last month)

* good documentation

You need to explain the benefits of .andthen() in comparison to Q.js, because
at the moment it just looks like another promises JS framework.

~~~
aravindet
I think the benefit is primarily a simpler API and nicer syntax for most of
the things you'd want to do.

For instance with Q.all, you'd do with:

return Q.all([ eventualAdd(2, 2), eventualAdd(10, 20) ]).then(function(values)
{ console.log(values[0], values[1]); });

can instead be

eventualAdd(2, 2). and(eventualAdd(10,20)). then(function(a, b) {
console.log(a, b); });

which I feel reads nicer and gives you the results in a more usable form
(something that would require another call, Q.spread, in Q). This also allows
complex composition. Say you want to run 4 functions A, B, C and D, such that
A and B are called together, C is called when A returns, then D is called when
B and C both return. This is clumsy to do on Q, requiring packing promises
into an array, etc.

The other big thing is error handling. In Q, if you forget to set an error
handler at the end of the chain or explicitly set the default handler with
.done(), errors go unhandled. This is clumsy; in fact the Q documentation
says:

"This is a stopgap. We are exploring ways to make unhandled errors visible
without any explicit handling."

We've implemented this in andthen. If there's no error handler and execution
reached the end of the chain, it will be thrown so Node or the browser will
print it.

There's fulfilment as well, but I get your point about putting this better in
the README.

~~~
jhrobert
This behaviour is not promise/a compatible. Make it optional and you become
promise/a compatible.

------
jhrobert

      p1.and( p2 ).then( function( p1_result, p2_result ){...});
    

I believe this is equivalent to:

    
    
      Q.all( p1, p2 ).spread( function( p1_result, p2_result ){ ... } );
    

There are other good reasons, at this point, to switch from Q to another
promise lib, speed for example, as was virulently signaled recently:
<http://jsperf.com/wqfwewefewrw/4>

------
aravindet
If you have any questions, I'm hanging out on <http://askabt.com/andthen>
(realtime chat).

------
perlgeek
I like the idea, but am I the only one who feels that having a method 'and'
feels a little too... cute?

I mean, it's not at all obvious that 'and' is related to parallel execution,
and it could very easily clash with another library that uses the same name.

------
jeremi23
How does it compare with Q.js ?

------
Mehul981
I also like this: <http://askabt.com/andthen> I think its kinda forum, who's
running this?

~~~
gjsrivastava
Its chat blended in forum and you can embed it any where :)

~~~
Mehul981
I like its integration with Gtalk.

~~~
blowski
I don't like all the suspiciously positive comments by new users appearing on
this thread. @Mehul981, are you affiliated with askabt by any chance?

------
Mehul981
its simple and small

~~~
aravindet
Yeah, barely 1.3 kb minified if you're using it on the client side. It's also
compatible with JQuery deferred's.

~~~
jhrobert
Compatible with jQuery deferred?

Only if you consider that it is compatible to miss P.Deferred(), P.promise(),
P.when(), parole.state(), parole.progress(), parole.done(), parole.fail() and
parole.always()

I tend to know about that because I am currently writing a lib that is going
to be both Q and jQuery compatible:
<https://github.com/JeanHuguesRobert/l8/wiki/ParoleReference>

------
hittudiv
looks awesome

