链fadeIn,fadeOut和异步animate()函数

时间:2019-03-23 23:57:43

标签: jquery

幸运的是,这段代码似乎很好用,因为在我看来,它易于使用和理解:

.red {
  font-size: 70px;
  color: red;
}

<font id="test" size="7">0000000000000000</font>

$('#test').fadeOut(500, function() {
  const $this = $(this);
  $this.text('11111111111111111111')
  .fadeIn(500)
  .fadeOut(500, () => {
    $this.text('2222222222222222');
    $this.css("color", "green").addClass("red")
  })
  .fadeIn(500)
  .delay(500)
  .animate({
      'margin-left': '250px'
    }, {
      duration: 3000
  })
  .delay(1000)
  .fadeOut(500)
});

jsFiddle:http://jsfiddle.net/6cwustkr/1/

但是,我不明白它为什么起作用。 animate()不是异步的吗?为什么即使最后的delay()和fadeOut()函数链接到animate()而不是作为animate()的回调函数放入,所有内容仍按正确的顺序执行?

1 个答案:

答案 0 :(得分:1)

因为这正是delay方法is intended to do的含义:

  

设置计时器以延迟队列中后续项目的执行。

这是一种特定于jQuery的方法,它允许延迟链接的jQuery调用。虽然您还可以 提出一种方法,该方法通过将后面的函数放入fadeanimate的回调中来实现相同的目的,但是如果您有很多这样的淡入淡出的话,它将变得很丑陋和动画。

这是一个可能的异步链接队列的示例,该队列具有与您感兴趣的行为相同的行为:

class Class {
  doSomething(fn) {
    const inst = this instanceof Child ? this : new Child();
    inst.queue.push(fn);
    if (!(this instanceof Child)) {
      inst.nextInQueue();
    }
    return inst;
  }
}
class Child extends Class {
  constructor() {
    super();
    this.queue = [];
  }
  nextInQueue() {
    if (this.queue.length) {
      const nextFn = this.queue.shift();
      Promise.resolve(nextFn())
        .then(() => this.nextInQueue());
    }
  }
  delay(ms) {
    this.queue.push(() => new Promise(res => setTimeout(res, ms)));
    return this;
  }
}

const c = new Class();
c
  .doSomething(() => console.log('something 1!'))
  .doSomething(() => console.log('something 2!'))
  .delay(1000)
  .doSomething(() => console.log('something 3'))