簡體   English   中英

使用 Promise 鏈實現詳細的睡眠功能

[英]Implementing a verbose sleep function using a chain of Promises

我正在嘗試使用 JavaScript 中的 Promise 實現睡眠功能。

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());

}

在第二個片段中,您需要立即解決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)
  })
}

如果你想組合兩個承諾,你可以在傳遞給第一個承諾的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的調用中得到解決,該調用由傳遞給sleepms參數化。

正如您所看到的,執行是交錯的,您將在console.log('A2');的輸出之前看到第二個承諾的語句console.log('B2')的日志輸出console.log('A2'); 第一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM