@gaubee/util 包中的 delay 函数,相比于市面上的 delay 函数,有着很特别的能力,就是它不仅仅是可以传递一个数字(毫秒),还可以传递一个 timmer 对象。

以下是详细的能力介绍:

  1. delay(0) 0 毫秒,那么它不会使用 setTimeout 来计时,而是会使用 queueMicrotask 来创建延迟队列。然而你知道 await 关键词本身就是在创建一个 queueMicrotask 队列,不同的是,const delayer = delay(0) 这里的 delayer 对象是可以进行取消的 delayer.cancel(reason?)
  2. delay(10) 等同于 setTimeout/clearTimeout
  3. delay(timmers.raf) 等同于 requestAnimationFrame/cancelAnimationFrame
  4. delay(timmers.eventTarget<AnyEvent>(window,'scrollend')) 等同于 addEventListener/removeEventListener(浏览器 EventTarget)
  5. delay(timmers.eventEmitter<AnyArgs>(event,'scrollend')) 等同于 addEventListener/removeEventListener(nodejs 的 EventEmitter)
  6. delay(pureEvent<AnyType>().once); 可以将一个 pureEvent 的 once 函数直接传递进去
  7. 你可以可以完全自定义什么时候进行 resolve,并返回解构函数:
    delay((resolve, reject) => {
      some.on(resolve);
      return () => some.off(resolve);
    });