Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2010-03-01

JSDeferredをnode.jsで試す

17:27

node.js を試してみた。

と言っても僕の興味は、JSDeferred と CommonJS の非同期 API である Promise をどう連携させるか、というアレゲなことなんだけど。

Node.js は

git clone git://github.com/ry/node.git
cd node
./configure
make
sudo make install

で /usr/local/ 以下にインストールした。

次に、JSDeferred にちょこっと手を入れる。まず、高速化のために Deferred.next_faster_way_** を定義してる部分に (typeof window === 'object') && というチェックを入れ、

jsdeferred.js の一番下に

exports.Deferred = Deferred;

という一行を足す。

jsdeferred.js と同じディレクトリに、公式サイトにある Hello World の例をちょっと弄って、こういうスクリプトを置いた。

  • hello_jsdeferred.js
sys = require('sys');
http = require('http');
Deferred = require('./jsdeferred').Deferred;

http.createServer(function (req, res) {
  var i = 0;
  res.writeHeader(200, {'Content-Type': 'text/html'});
  Deferred.loop(10, function() {
    return Deferred.wait(1)
    .next(function () {
      res.write('<p>' + (i++) + '</p>');
    })
  })
  .next(function() {
    res.close();
  })
}).listen(8000);
sys.puts('Server running at http://127.0.0.1:8000/');

あとは

node hello_jsdeferred.js

してブラウザで http://127.0.0.1:8000/ に接続すると、動いてることは確認できた。

簡単だね。


Promise について

Promise はほぼ JSDeferred と同じようなもので、今のところ API が提案されているだけ。

requestSomeData("http://example.com/foo") // returns a promise for the response
    .then(function(response){ // ‘then’ is used to provide a promise handler 
        return JSON.parse(response.body); // parse the body
    }) // returns a promise for the parsed body
    .then(function(data){
        return data.price; // get the price
    }) // returns a promise for the price
    .then(function(price){ // print out the price when it is fulfilled
        print("The price is " + price);
    });
CommonJS/JSGI: The Emerging JavaScript Application Server Platform | SitePen Blog

というようなことが出来るようになる。

then の引数は、1つ目が callback で、2つ目が error callback、3つ目が progress callback となる。

あと when とか emit とかよくわからないメソッド

以下、あとで読む的 reference。

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20100301
 |