代码之家  ›  专栏  ›  技术社区  ›  brk

如何在javascript方法链接中休眠方法

  •  4
  • brk  · 技术社区  · 4 年前

    我试图使一个方法在方法链接中休眠(延迟)。我用的就是这个 setTimeout Promise . 这将需要以下任何方法 sleep 呆在房间里 then

    现在我调用函数

    lazyMan("John", console.log).eat("banana").sleep(5).then(d => {d.eat("apple");}); .

    这是我的密码

    function lazyMan(name, logFn) {
      logFn(name);
      return {
        eat: function(val) {
          console.log(val);
          return this;
        },
        sleep: function(timer) {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              console.log(`Sleeping for ${timer} seconds`);
              resolve(this);
            }, timer * 1000);
          }).then(d => this);
        }
      };
    }
    lazyMan("John", console.log)
      .eat("banana")
      .sleep(5)
      .then(d => {
        d.eat("apple");
      });

    lazyMan("John", console.log).eat("banana").sleep(5).eat("apple")

    我经历过 Add a sleep method in a object method chain(JS)

    1 回复  |  直到 4 年前
        1
  •  5
  •   VLAZ Sohail Arif    4 年前

    你可以遵守你的“任务队列”的承诺,所以任何需要做的事情都会通过添加到那里 .then() . 这为调度工作提供了一个流畅的API。

    function lazyMan(name, logFn) {
      logFn(name);
      let taskQueue = Promise.resolve();
      const addTask = f => {
        taskQueue = taskQueue.then(f);
      }
      return {
        eat: function(val) {
          addTask(() => console.log(`Eating [${val}]`));
          return this;
        },
        sleep: function(timer) {
          addTask(() => new Promise((resolve, reject) => {
            console.log(`Start sleeping for ${timer} seconds`);
            setTimeout(() => {
              console.log(`End sleeping for ${timer} seconds`);
              resolve();
            }, timer * 1000);
          }))
          return this;
        }
      };
    }
    
    lazyMan("John", console.log)
      .eat("banana")
      .sleep(5)
      .eat("apple");

    请注意,此更改意味着每个操作在技术上都是异步的。然而,这至少是一致的,所以记住这一点的时候就不太可能有惊喜了。