Bruno, I completely agree with this, 2012/8/8 Bruno Jouhier <[email protected]>
> Jose, > > The continuation-passing-style patterns for conditionals and loops are > relatively straightforwards but things get a lot hairier with try/catch and > try/finally. But also, what about: > > * unary and binary operators: async1(_) <= async2(_) > * lazy operators: async1(_) && async2(_) > * ternary operators: cond ? async1(_) : async2(_) > * async conditions in conditionals (ternary, if) and loops > * call chaining: async1(_).async2(_) > * composition: async1(_, async2(_)) > * any combination of the above. > > You could write generic continuation-passing-style helpers for all these > language constructs but they would not help much with the code bloat and > readability. And even if you get there, you still have to worry about lots > of other details like trampolining calls so that you don't blow the stack > with async calls that sometimes invoke their callback synchronously, etc. > If you want to seamlessly and safely use all JS language constructs with > async calls, you need a solid language extension (or the fibers library). > > Actually, streamline.js started as an attempt to find CPS patterns for all > the JS language constructs. The difficulty was to find "composable" > patterns, i.e. patterns that can be combined with each other in arbitrary > ways. Once I had the right patterns, it was relatively easy (although not > completely trivial) to write a transformation algorithm that would > automatically apply the patterns. > > I described all the code patterns that I used (including try/catch and > try/finally) in a tedious blog article: > http://bjouhier.wordpress.com/2011/05/24/yield-resume-vs-asynchronous-callbacks/Of > course, you could apply these patterns "manually" without using the > streamline compiler but this is clearly error prone and overwhelming. > > Bruno > > > On Wednesday, August 8, 2012 7:18:56 PM UTC+2, José F. Romaniello wrote: > >> I wrote a blogpost about this specific topic: >> >> http://joseoncode.com/2012/06/**24/messing-with-cps-in-js/<http://joseoncode.com/2012/06/24/messing-with-cps-in-js/> >> >> >> for me there are two ideal situations: >> >> >> - a language with an specific syntax for asynchronous flows like >> streamlinejs, icedcoffeescript, f# >> - or make a Continuation Passing Style version of the javascript >> constructs (if, for, while, try/catch) (similar to lisp family languages) >> >> there are also a lot of async libraries I know. >> >> 2012/8/7 Dan Milon <[email protected]> >> >>> I am wondering which are the different patterns to handle cases like >>> >>> >>> var results >>> if (cond) { >>> async1(function (err, res) { >>> results = res >>> }) >>> } >>> else { >>> async2(function (err, res) { >>> results = res >>> }) >>> } >>> // here need to do something with results. >>> >>> The problem is obvious, but i cannot see any good way to overcome it. >>> >>> >>> -- >>> Job Board: http://jobs.nodejs.org/ >>> Posting guidelines: https://github.com/joyent/**node** >>> /wiki/Mailing-List-**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 >>> nodejs+un...@**googlegroup**s.com >>> >>> For more options, visit this group at >>> http://groups.google.com/**group**/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en> >>> >> >> -- > 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 > -- 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
