如何在javascript方法链中休眠一个方法

brk*_*brk 5 javascript

我正在尝试在方法链中创建一个方法 sleep(delay) 。对于这个我使用setTimeoutPromise。这将需要在 之后的任何方法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");
  });
Run Code Online (Sandbox Code Playgroud)

有没有办法可以修改我的函数来调用它lazyMan("John", console.log).eat("banana").sleep(5).eat("apple")并以相同的顺序获取输出

我已经经历了在对象方法链中添加睡眠方法(JS)

VLA*_*LAZ 9

您可以对“任务队列”保持承诺,因此需要完成的任何事情都将通过.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");
Run Code Online (Sandbox Code Playgroud)

请注意,此更改意味着每个操作在技术上都是异步的。然而,这至少是统一的,所以记住它时不太可能出人意料。