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

使用承诺链实现详细睡眠函数

  •  -2
  • lifebalance  · 技术社区  · 7 年前

    我正在尝试使用JavaScript中的承诺实现一个睡眠函数。

    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!" ));
    
    }
    

    不,它只是挂着!有什么好处?

    使现代化 当前位置我真正想做的是把它写成一系列的承诺电话。

    function sleep(ms) { 
        var beginAnnounce = new Promise(...);
        var goSleep = new Promise (...);
        var endAnnounce = new Promise...);
    
        return beginAnnounce.then(goSleep).then(endAnnounce());
    
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Ionut Achim    7 年前

    在第二个代码段中,您需要解析 begin

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

    它在第一个代码段中起作用的原因是您从不依赖 要完成,您只需在那里记录开始。但这不是你想要的方式。有一个立即解决的承诺是没有意义的(无论如何,对于您的用例来说不是这样)。所以你应该做一些类似的事情:

    function sleep(ms) {
      console.log("Sleep function called for " + ms + " ms\n")
    
      return new Promise(resolve => {
        setTimeout(() => {
          console.log("Sleep done!")
          resolve()
        }, ms)
      })
    }
    
        2
  •  1
  •   FK82    7 年前

    如果要编写两个承诺,可以在传递给的回调中返回第二个承诺 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 函数是一个高阶函数,它返回另一个返回承诺的函数。这一承诺在呼吁 Window.setTimeout ms .

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