2007年 12月 11日

JSDeferred

そういえば、あらかじめデータは取得しておきたいけど、表示自体は遅延したい、みたいな場合 (ホバーツールチップみたいなやつ) にもめっさつかえるなぁねむい。

var d = null;

anElement.addEventListener("mouseover", function (e) {
    if (d) d.cancel();
    // http.get はおこなわれるが、少なくとも 1 秒遅延してから表示する
    d = parallel({
        wait:  wait(1),
        value: http.get("foobar")
    }).next(function (o) {
        show(e.pageX, e.pageY, o.value); // show はどっかで定義
    });
}, false);

anElement.addEventListener("mouseout", function (e) {
    if (d) d.cancel();
}, false);

これだとまだまずいけど (mouseover が発生しまくるから//http.get をキャッシュつきにラップすればスマートかも) wait(1) してからロードしにいくみたいにするより、これだと同時によみこむから待ち時間がへる (その変わりリクエストが必ずとんでサーバに負荷かかる)