[英]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
的調用中得到解決,該調用由傳遞給sleep
的ms
參數化。
正如您所看到的,執行是交錯的,您將在console.log('A2');
的輸出之前看到第二個承諾的語句console.log('B2')
的日志輸出console.log('A2');
第一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.