8

Javascript でのメソッド チェーンについて詳しく学ぼうとしています。チェーン内の次の関数への jQuery を使用せずに遅延を作成する適切な方法を知りたいです。

var foo = function() {
    this.delay = function(per) {
        setTimeout(start, per);
        return this;
    };
    this.start = function() {
        alert('start!');
    };
};

var bar = new foo().delay(1000).start();
4

2 に答える 2

9

これは簡単ではありません。jQuery は特定のキュー システムを使用します。

jQuery を使用せずに実行したい場合は、自分でキューを実装する必要があります。

たとえば、この非常に単純な実装:

var foo = function() {
    var queue = [];
    var timer;
    this.delay = function(per) {
      timer = setTimeout(function(){
        timer = 0;
        var f;
        while (f = queue.shift()) f();
      }, per);
      return this;
    };
    this.addFunction = function(f) {
      if (timer) queue.push(f);
      else f();
      return this;
    };
    this.start = function() {
       this.addFunction(function(){alert('start')});
       return this;
    };
};

デモンストレーション


fooで定義されていない別の関数をチェーンしたい場合は、そうすることができます

var bar = new foo().delay(3000).start()
    .addFunction(function(){alert("another chained one")});

デモンストレーション

于 2013-01-16T18:40:20.097 に答える
3

これにより、複数の遅延を連鎖させることができます: http://jsfiddle.net/z4Uyf/1/

js:

var foo = function() {

  var delayed = [];
  var delayExecution = false;
  var delayCount = 0;   
  function handleDelay(func){
    delayed.push(func);
    delayCount++;
  }

   function delayDone(){
     delayExecution = false;
     if( typeof(delayed[0]) == "function" ){
       delayed[0]();
       delayed.splice(0,1);
     }
     if( delayed.length > 0 ) delayExecution = true;
   }

   this.delay = function(per) {
        delayExecution = true;
        setTimeout(function(){
          delayDone();
        }, per);
        return this;
   };

  this.start = function() {
    if( delayExecution ){
     handleDelay(arguments.callee);
    }else{
     alert("start!");
    }
    return this;
  };
};

var bar = new foo().delay(1000).start().delay(5000).start();
于 2013-01-16T20:01:59.323 に答える