読者です 読者をやめる 読者になる 読者になる

Twitter検索をだらだら眺めるおもちゃ

こないだの朝ニコ ベーシックインカム話の時に手元の環境にハッシュタグを自動で追う環境がなくておにょれ!ってなってそんな感じ。ほんとは触りだしたJavaScriptを使ってなんかしたかっただけ。でもいざ作ったらJavaScriptの勉強よりはjQuery(のEffectとかその辺)の勉強になっちまった気がする。あとJSDeferred(の綴りの勉強)。

難しかったというか自分で解決できなかた部分が一つ。

27秒周期で検索結果を引っ張ってくるクローラー部分をJSDefferdで切り離してる。検索条件が変化したらその場で新たに検索を開始したいのだけど、既存のクローラーにやらせると、検索条件が変化しても、クローラーが待ち時間を消費するのを待たないといけない。じゃあ新規にクローラー走らせて古いのはkillしようと思ったけどどうもkillとかcancelみたいな事はできない臭くて、検索条件変わるたびにクローラーがポコポコ産まれちゃう。

じゃあどうすんべと砂糖の妖精に聞いたら、最新のJSDeferredにはDeferred.earlierとやらがあってそれを使えば幸せになれるかもとかヒントをくれた。

earlier(スペルが覚えられない)はparallelの親戚みたいなもんだと理解している。parallelが複数処理をがんばるのに対し、earlierは複数走らせて誰か一人死んだらみんな殺す。あってますかね。

でまぁ結果、出来たのでコード。

Deferred.earlier([
  // ↓27秒待ち君
  next(function() {
    search(); // getJSONな関数
    return wait(27).next(arguments.callee);
  }),
  // ↓検索条件の変化を察知君
  next(function() {
    var d = new Deferred();
    // ↓jQueryでinputが変化したら呼ばれるchange君
    $("#word").change(function(){
      search(); // getJSONな関数
      d.call();
    })
    d.canceller = function () {};
    return d;
  })
]);

27秒を待てば検索結果を取りに行き、検索条件が変わればその場で再度検索をする、を繰り返す。てのをパインアメの妖精に書いてもらった!自分では書けなかった!

earlierにはDeferredを渡さないとだからd.callとかはなんとなくは解るんですけど、なんでこいつがループするのかよくわかってない。てゆうかほんとにちゃんと動いてんのかしら。まぁいいか。

あとはスパゲッティを茹でまくってまぁ動いてる風にはできました。ぱちぱちぱちぱち。