2016-12-15 83 views
0
function timeout(delay) { 
    return new Promise((resolve, reject) => { 
     setTimeout(resolve, delay); 
    }); 
} 

function printDots(delays) { 
    return delays.map((delay) => { 
     return timeout(delay).then(() => process.stdout.write('.')) 
    }).reduce((acc, prom) => acc.then(prom)); 
} 

printDots([513, 3402, 1337, 4122]).then(() => process.stdout.write('DONE!')); 

這將打印.DONE!...但我預計這將打印....DONE!減少承諾返回早期

回答

2

。然後需要一個功能,因爲它的參數(onFullfilled, onRejected),這不是一個函數的任何值完全忽略

但是,prom中的減少回調是一個承諾,所以只有第一個承諾將被等待

簡單改變,標記下面編輯應該解決的事情

function timeout(delay) { 
    return new Promise((resolve, reject) => { 
     setTimeout(resolve, delay); 
    }); 
} 

function printDots(delays) { 
    return delays.map((delay) => { 
     return timeout(delay).then(() => process.stdout.write('.')) 
    }).reduce((acc, prom) => acc.then(() => prom)); 
    //        ^^^^^^ 
} 

printDots([513, 3402, 1337, 4122]).then(() => process.stdout.write('DONE!')); 

但是請注意,該承諾都將在大約同一時間開始,無需等待0到前1點給出這一點,可以說是更好的解決方案開始等

結束對於printDots是使用Promise.all

function printDots(delays) { 
    return Promise.all(delays.map((delay) => timeout(delay).then(() => process.stdout.write('.')))); 
} 

按照意見,承諾需要按順序運行 - 這是因爲只有通過減少

一樣簡單
function timeout(delay) { 
    return new Promise((resolve, reject) => { 
     setTimeout(resolve, delay); 
    }); 
} 

function printDots(delays) { 
    return delays.reduce((acc, delay) => acc.then(() => timeout(delay).then(() => process.stdout.write('.'))), Promise.resolve()); 
} 

printDots([513, 3402, 1337, 4122]).then(() => process.stdout.write('DONE!')); 

在這種情況下,你需要提供一個最初的承諾(Promise.resolve)減少,使第一次迭代正在與一個承諾像所有後續的有

+0

這工作,和標記是一個很好的接觸!謝謝。 –

+1

那麼,他們仍然發生在錯誤的順序。請參見[this](https://repl.it/Eq9z/1) – 4castle

+0

單行中的6個字符更改有時可能很難找到:p –