延迟到方法链中的下一个功能

use*_*408 8 javascript delay method-chaining

我想了解更多有关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();
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 8

这不容易做到.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;
    };
};
Run Code Online (Sandbox Code Playgroud)

示范


如果你想链接另一个未在foo中定义的函数,你可以这样做

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

示范