使用 Promises 链实现详细的睡眠功能

Implementing a verbose sleep function using a chain of Promises

我正在尝试使用 JavaScript 中的 Promises 实现睡眠功能。

function sleep(ms) {

  var begin = new Promise(resolve => {
    console.log("Sleep function called for " + ms + " ms\n")
  });

  return new Promise(resolve => setTimeout(resolve, ms))
    .then(() => console.log("Sleep done!" ));

}

并且有效。但是,

function sleep(ms) {

  var begin = new Promise(resolve => {
    console.log("Sleep function called for " + ms + " ms\n")
  });

  return begin.then(resolve => setTimeout(resolve, ms))
    .then(() => console.log("Sleep done!" ));

}

不会,只是挂起!是什么赋予了?

更新:我真正想做的是将它写成一系列 promise 调用。

function sleep(ms) { 
    var beginAnnounce = new Promise(...);
    var goSleep = new Promise (...);
    var endAnnounce = new Promise...);

    return beginAnnounce.then(goSleep).then(endAnnounce());

}

在第二个片段中,您需要立即解析begin

var begin = new Promise(resolve => {
  console.log("Sleep function called for " + ms + " ms\n")
  resolve()
})

它在第一个片段中起作用的原因是因为您从不依赖 begin 来完成,您只需要在那里记录开始。但这不是您想要的方式。立即解决的 Promise 毫无意义(无论如何都不适用于您的用例)。所以你应该做这样的事情:

function sleep(ms) {
  console.log("Sleep function called for " + ms + " ms\n")

  return new Promise(resolve => {
    setTimeout(() => {
      console.log("Sleep done!")
      resolve()
    }, ms)
  })
}

如果您想组合两个承诺,您可以 return 传递给第一个承诺 Promise.prototype.then 的回调中的第二个。

看看下面的代码:

const sleep = ms => () => new Promise((resolve, reject) => window.setTimeout(resolve, ms));

Promise.resolve()
.then(() => { console.log('A1');})
.then(sleep(2000))
.then(() => {console.log('A2');});

Promise.resolve()
.then(() => {console.log('B1');})
.then(sleep(1000))
.then(() => {console.log('B2');});

sleep 函数是一个高阶函数,它 return 是另一个 return 承诺的函数。此承诺在对 Window.setTimeout 的调用中解决,该 Window.setTimeout 由传递给 sleepms 参数化。

如您所见,执行是交错执行的,您将在第一个 console.log('A2'); 的输出之前看到第二个 promise 的语句 console.log('B2') 的日志输出。