2016-12-15 62 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 –