枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

JSDeferred

JSDeferred - 素人がプログラミングを勉強していたブログ
これみてJSDeferredを勉強しようとなんかやってみたけど、

// ==UserScript==
// @name           Deferred Test
// @namespace      http://d.hatena.ne.jp/Constellation/
// @include        http*
// @require        http://svn.coderepos.org/share/lang/javascript/jsdeferred/trunk/jsdeferred.userscript.js
// ==/UserScript==
with(D()){

Deferred.listener = function ({event:evt, target:t, capture:c},fun) {
  var d = new Deferred();
  d.callback.ok = fun;
  t = t || window;
  c = c || false;

  function _fun (e){
    try { d.call(e) } catch(e) { d.fail(e) }
  }
  t.addEventListener(evt,_fun,c);
  d.clear = function () {
    try { t.removeEventListener(evt,_fun,c) } catch(e) {}
    return d;
  }
  return d;
}

var l = listener({event   : 'click',
                  target  : window ,
                  capture : false   },
  function(e){
    alert('Event: '+e);
    alert(1)                             // 1番目 =>1
    // this.clear();                     // removeEventListener
    return wait(2).next(function(){
      alert(2);                          // 2番目 =>2
      return 3;                          // nに渡す
    });
  }
);

l.next(function(n){
  alert(n);                              // 3番目 =>3
})
.error(function(e){
  alert(e);
})

// l.clear();                            //removeEventListener

lの確保のためにメソッドチェーンがばっさり切れてしまう。。。
つなげるとremoveEventListenerができなくなるしなあ。
同じ様な感じでこんな風なのも

Deferred.listener = {};

Deferred.listener.add = function({event:evt, target:t, capture:c}){
  var d = new Deferred();
  t = t || window;
  c = c || false;
  function fun (ev){
    try { d.call(ev) } catch(e) { d.fail(e) }
  }
  t.addEventListener(evt,fun,c);
  d.remove = function () {
    try { t.removeEventListener(evt,fun,c) } catch(e) {}
    return d;
  }
  return d;
}

listener.add({event:'click'})
  .next(function(e){alert(e)});

難しい。

JSDeferredって思ってたのとかなり構造が違ってた。
Deferredオブジェクトをつなげて、上から順にsetTimeoutで実行しながら降りていく感じなのかな?
returnでDeferredのオブジェクトを返すと、そちら側の処理にいったん移って、また戻ってくる。

Remove all ads