Поскольку функция asyn c возвращает обещание, вам следует ожидать, что ваш аккумулятор - это обещание. Таким образом, вы должны сделать что-то вроде этого:
console.log("Program starting at", Date());
function delayedResolver(a, ms) {
return new Promise(function(resolve, reject) {
setTimeout(() => {
console.log("resolving at", Date());
resolve(a);
}, ms);
});
}
arr = [1, 3, 5];
r = arr.reduce(async function(a, b) {
return await delayedResolver(a, 3000).then(v => v + b);
}, Promise.resolve(0));
console.log(r);
r.then(v => console.log("final value", v, "at", Date()));
Вы должны рассматривать аккумулятор как обещание и каждый раз возвращать новое обещание.
Обратите внимание, что функция asyn c возвращает обещание и reduce
немедленно применяют функцию asyn c к следующей паре (accumulator, entry)
, поэтому все эти обещания, возвращаемые функцией asyn c, создаются почти мгновенно, поэтому обещания разрешаются все после 3 секунд, а не по одной.