Live data from Hacker News

Three Routes to Spaghetti-Free Javascript

zef.me

11–18 of 18 posts

Re: Three Routes to Spaghetti-Free Javascript

#13
Route 1: Streamline.js, a compiles-to-Javascript language.

Route 2: Mobl, a compiles-to-Javascript language.

Route 3: Stratified.js, a compiles-to-Javascript language.

And then a side-mention for something actually in Javascript: https://github.com/caolan/async

So, to make spaghetti-free Javascript... don't write Javascript? I'll keep looking, thanks.

Re: Three Routes to Spaghetti-Free Javascript

#14
post #13

Route 1: Streamline.js, a compiles-to-Javascript language. Route 2: Mobl, a compiles-to-Javascript language. Route 3: Stratified.js, a compiles-to-Javascript language. And then a side-mention for something actually in Javascript: https://github.com/caolan/async So, to make spaghetti-free Javascript... don't write Javascript? I'll keep looking, thanks.

Try jQuery's deferred events. It is, IMO, the most elegant actual-JavaScript solution to the problem I've seen.

Re: Three Routes to Spaghetti-Free Javascript

#15
post #5

I've written a library for internal use (that I'm waiting for work to agree to open source) that basically lets you bundle a group of asynchronous calls into a single callback. I prefer this method because it doesn't try and hide the asynchronous nature of the code, it just frees you up from having to nest your callbacks N deep when you require the output from all N asynchronous operations to continue. Wondering what…

While I appreciate why people would want to abstract around them for some use cases, I gotta point out that nested serial callbacks aren't just a nuisance. 95%ish of the serial cbs I've written in Node have benefited from their nested lexical scoping: A cb in a serial chain tends to rely on results from earlier in the chain, and it's nice to be able to refer to variables in the outer scopes without having to pass hella arguments between callbacks.

Re: Three Routes to Spaghetti-Free Javascript

#16
post #7
post #6

Earlier quoted context omitted.

It's been done. One of the best libraries for managing asynchronous code in JS without hiding it away is http://github.com/caolan/async I agree wholeheartedly, by the way. There's way too much scope for leaky abstractions when you try to hide away the true nature of asynchronous code. Same reason, I think, why most people are lukewarm about using continuations in web development, like e.g. Seaside does: in principle,…

Yeah, I assumed there had to be libraries to do this already, but didn't come across anything that did what I wanted. I'll check out async though, thanks for the heads up.

There are many many attempts at solving this problem, both libraries and preprocessors. None seem to satisfy a large audience, most people seem to deal with the callback nesting and hope to avoid cases where it gets super ugly.

I have a lot bookmarked on github, these are mostly libraries.

https://github.com/coolaj86/futures https://github.com/substack/node-seq https://github.com/marcuswestin/fun https://github.com/creationix/step https://github.com/chriso/chain.js https://github.com/substack/node-chainsaw https://github.com/caolan/async https://github.com/kriszyp/promised-io https://github.com/kriszyp/node-promise https://github.com/technoweenie/node-chain-gang https://github.com/creationix/do https://github.com/willconant/flow-js https://github.com/creationix/conductor

Some branches of CoffeeScript are also trying to ease the pain. Defer keyword didn't make it into CoffeeScript main. My impression is CoffeeScript makes callback hell less ugly anyway, so there is less need for adding a complex language feature that generates unreadable JavaScript.

Post reply on HN