ある値を非同期で取ってくる→その値を使ってさらに非同期処理というのをJSDeferredでする
ユースケースとしては、テストの最初にあるシステムにログインしてユーザIDなりセッションIDなりを得て、それでもって残りのテストを実行するみたいな処理です。
これ、素直にJSDeferredでDeferred.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++