Black lives matter
Portrait Dr. Axel Rauschmayer
Dr. Axel Rauschmayer
Homepage | Twitter
Cover of book “JavaScript for impatient programmers”
Book, exercises, quizzes
(free to read online)
Cover of book “Deep JavaScript”
Book (50% free online)
Cover of book “Tackling TypeScript”
Book (first part free online)
Logo of newsletter “ news”
Newsletter (free)

Make node.js code pretty via a generator-based library

[2011-03-19] esnext, dev, nodejs, javascript
(Ad, please don’t block)

The JavaScript server environment node.js has an intriguing approach to coding: Do other things while waiting for results from, say, a database. But don’t use threads to juggle those things, use continuations. This is similar to what client-side JavaScript code (such as Ajax calls) already looks like. Not having to create threads saves a lot of overhead when loads are high. Multi-core and multi-processor systems can still be supported, by scheduling one “instance” of node.js per core/processor.

The only problem with node.js code: You get one nested function expression for each outside request you make.

    io.doFirst(param1, function(result1) {
        io.doSecond(param2, function(result2) {
            // work with result1 and result2
It is obvious that this can quickly turn ugly. Now David Herman from Mozilla has created task.js [1], a JavaScript library that turns the above code into the much more readable code below [2].
    var result1 = yield io.doFirst(param1);
    var result2 = yield io.doSecond(param2);
    // work with result1 and result2
This is reminiscent of multi-threading and blocking, but it works cooperatively (no preemptive multi-tasking). The similarities don’t end there: You can also do fork-join as follows:
    var [result1, result2] = yield join(io.doFirst(param1),
That way, you can start both operations. They can finish in any order, but your code only continues after both are finished. task.js is based on generators [3], a JavaScript feature that is already in Firefox and will probably be in the next version of the ECMAScript standard [4].

Related reading:

  1. task.js on GitHub
  2. Who says JavaScript I/O has to be ugly?
  3. Iterators and generators [Firefox documentation]
  4. the “TXJS” update by Eich