[OPs nicht genau ansprechen; konzentrierte sich auf andere, die hier landen.]
Reduzieren wird häufig verwendet, wenn Sie das Ergebnis der vorherigen Schritte benötigen, bevor Sie das nächste verarbeiten können. In diesem Fall können Sie Versprechen a la aneinander reihen:
promise = elts.reduce(
async (promise, elt) => {
return promise.then(async last => {
return await f(last, elt)
})
}, Promise.resolve(0))
Hier ist ein Beispiel mit fs.promise.mkdir () (sicher, viel einfacher, mkdirSync zu verwenden, aber in meinem Fall ist es über ein Netzwerk):
const Path = require('path')
const Fs = require('fs')
async function mkdirs (path) {
return path.split(/\//).filter(d => !!d).reduce(
async (promise, dir) => {
return promise.then(async parent => {
const ret = Path.join(parent, dir);
try {
await Fs.promises.lstat(ret)
} catch (e) {
console.log(`mkdir(${ret})`)
await Fs.promises.mkdir(ret)
}
return ret
})
}, Promise.resolve(""))
}
mkdirs('dir1/dir2/dir3')
Unten ist ein weiteres Beispiel, das 100 + 200 ... 500 addiert und ein bisschen wartet:
async function slowCounter () {
const ret = await ([100, 200, 300, 400, 500]).reduce(
async (promise, wait, idx) => {
return promise.then(async last => {
const ret = last + wait
console.log(`${idx}: waiting ${wait}ms to return ${ret}`)
await new Promise((res, rej) => setTimeout(res, wait))
return ret
})
}, Promise.resolve(0))
console.log(ret)
}
slowCounter ()