ある値を非同期で取ってくる→その値を使ってさらに非同期処理というのをJSDeferredでする

ユースケースとしては、テストの最初にあるシステムにログインしてユーザIDなりセッションIDなりを得て、それでもって残りのテストを実行するみたいな処理です。
これ、素直にJSDeferredDeferred.next(...).next(...)と続けても、このnextのコールバックは最初にいきなり呼ばれたあと「待ち」に入るので、非同期で取ってきた値に依存した処理は書けないんですよね。
これは、Deferredオブジェクトを自分で作って制御すればいけるみたいです。

以下サンプルコードです。最初の100msかかる非同期処理で42という値を得て、それを次の処理に渡せることを確認します:

#!/usr/bin/env node
"use strict";

var Deferred = require('./jsdeferred.js').Deferred;

Deferred.
next(function() {
    console.log('# 1');

    var d = new Deferred;
    setTimeout(function() {
            console.log('# 2');
            d.call(42);
            console.log('# 4');
    }, 100);
    return d;
}).
next(function(foo) {
    console.log('# 3');
    console.log('got %s', foo);
    setTimeout(function() {
        console.log('# 5');
    }, 1);
}).error(function(e) {
    console.log(e);
});

console.log('# 0');

結果は#の番号通りになります:

# 0
# 1
# 2
# 3
got 42
# 4
# 5

このような連鎖がいくつもある処理をJSDeferredを使わずにやろうと思うと気が遠くなりますね。id:cho45++