Hey Jean - 

> You probably had at look at taskjs.org.

Ya, I've been tracking task.js for awhile now - just haven't delved in too 
deeply since node is realistically the only platform generators are going 
to be practical on in the near future (browser support is obviously pretty 
sparse still).  On the one hand, task.js is awesome and deserves the hype 
it's received.  On the other hand, I find the promises layer to be a 
deterrent against using it for Node applications, since the majority of the 
node ecosystem is based on passing callbacks/continuations, rather than 
promises.  That's probably the most fundamental difference between suspend 
and task.js: suspend is designed to be 

> After much thinking, I came to the conclusion that this flow control 
issue is not such a big deal, solutions like "promise/a" demonstrates that 
async activities can be orchestrated in a readable way without threads.

I agree that promises *can* improve the situation, but I think it has to be 
all-or-nothing.  The random hodgepodge of promises use in node modules is 
problematic - it's not the fault of promises, of course.  It's just 
confusing when/where you need to .then() vs. pass a callback.  Regardless 
of your feelings towards promises, though, it's important to recognize that 
they're still just an abstraction on top of callbacks - you're either 
passing a callback to the method itself, or you're passing a callback to 
some method on your promise/future/deferred/etc.  This is why generators 
are particularly interesting with regards to async code: they're the first 
*language* level construct in JS that allows this async behavior without 
relying callbacks.

> I am conducting an experiment about a similar control flow problem

Parole looks really interesting!  I'm going to give the source a 
more thorough reading once I have time, but on first glance I like that it 
thinks outside of the box, compared to 90% of the other control flow 
libraries out there.

> This is more concise, does not have the array destructuring issue, runs 
today everywhere and is readable once you understand that a Parole() is an 
extended Function suitable as a node.js callback.

Given where destructuring assignment and generators currently stand in 
V8/node, you're probably right for now, but remember that my goal is to get 
ahead of the curve here in anticipation of these upcoming language 
features.  I think I would still prefer the following:

    var resume = require('resume'), fs = require('fs');

    suspend(function* (resume) {
        var [err, buffer] = fs.readFile(__filename, resume);
        // no callbacks or .on()'s or .then()'s, just use it!
        console.log(buffer.toString('utf8'));
    });

True, you have to pay the suspend/generator block, but that's a tax you 
only have to pay once, and you can have as many async calls in there as 
you'd like with no additional "taxation".

Thanks for the feedback, and I'm looking forward to hacking around with 
Parole!

- Jeremy

On Wednesday, May 29, 2013 7:12:20 PM UTC-4, Jean Hugues Robert wrote:
>
> Hi,
>
> This is interesting. You probably had at look at taskjs.org.  Generators 
> are kinds of structured fibers that, yes, can be "abused" to provide some 
> form of threading. How "unobstrusive" this can be remains to be fully 
> explored, as you do, in good company (see also streamline implementation 
> using generators, an interesting exploration too).
>
> Your approach reminds me about the "await" construct in C#, the"yield" in 
> your example really means "await".
>
> After much thinking, I came to the conclusion that this flow control issue 
> is not such a big deal, solutions like "promise/a" demonstrates that async 
> activities can be orchestrated in a readable way without threads. Besides, 
> early implementations of generators are apparently rather slow (fibers are 
> fast, non standard... and controversial).
>
> I am conducting an experiment about a similar control flow problem, here 
> is one result:
>
>   var Parole = require('l8/lib/whisper'), fs = require( 'fs' );
>
>  
>
>   var read = Parole(); fs.readFile( __filename, read );
>
>   read.on( function( err, data ){ console.log( data.toString( 'utf8' ); } 
> );
>
>   // or: read.then( function( data ){ console.log( data.toString( 'utf8' 
> ); } );
>
>
> This is more concise, does not have the array destructuring issue, runs 
> today everywhere and is readable once you understand that a Parole() is an 
> extended Function suitable as a node.js callback.
>
> See https://github.com/JeanHuguesRobert/l8/wiki/ParoleReference. You may 
> be surprised by the P.generator() easy way of defining an async generator 
> using today's javascript.
>
> Yours,
>
>     Jean Hugues
>
>
>
>
>  
>
>

-- 
-- 
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 nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to nodejs+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to