2016-12-15 6 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!...を出力しますが、私はそれはそれは引数(onFullfilled, onRejected)だとして....DONE!削減約束は早期

答えて

2

.thenは関数ではありません任意の値が

無視 全くで、機能を期待印刷することが期待さ

ただし、還元コールバックのpromは約束ですので、最初の約束が待たれます

単純な変更、マークEDは以下の約束がすべてほぼ同時に開始されることが、物事に

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のコメントを1として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

を参照してください。1行に6文字の変更を加えると、時々見つけにくくなる場合があります。p –