Любой метод работает.Поскольку sumTotal
является синхронным, в большинстве случаев это не имеет значения.Единственный раз, когда может иметь значение, это если items
является необоснованно огромным массивом, и для его итерации требуется немалое количество процессорного времени - в этом случае было бы лучше вызвать sumTotal
с Promise.all
, чтобы он мог разрешить сразу после разрешения обещаний, вместо того, чтобы ждать дорогой операции после , а остальные обещания разрешаются.
Но,имейте в виду, что Promise.all
также принимает не-Обещания: нет необходимости преобразовывать sumTotal
во что-то, что возвращает Promise
.
Кроме того, если items
является массивом объектов сprice
, обязательно укажите reduce
начальное значение, иначе вы можете получить что-то вроде [Object object]102030
для total
:
const somethingAsync = () => new Promise(res => setTimeout(res, 500, 'foo'));
function sumTotal(items) {
return items.reduce((total, item) => item.price + total, 0)
}
function checkOut(items) {
return Promise.all([
somethingAsync(),
somethingAsync('johndoe@gmail.com'),
sumTotal(items)
]).then(([offers, details, total]) => (
{ offers, details, total }
));
}
console.log('start');
checkOut([{ price: 10 }, { price: 20 }])
.then(output => console.log(output));