Есть ли преимущество в использовании синхронной функции внутри Promise.all?
Скажем, у меня есть синхронная функция, как это:
function sumTotal(items) {
return items.reduce((total, item) => item.price + total)
}
И он используется после Promise.all, содержащего некоторые асинхронные вызовы API в этой функции 'checkout'
function checkout(items) {
return Promise.all([
getLatestOffers(),
getCustomerDetails('johndoe@gmail.com')
]).then(([offers, details]) => {
return { offers, details, total: sumTotal(items) }
});
}
Есть ли какое-либо преимущество, с точки зрения производительности или другого, в изменении функции sumTotal для возврата обещания и его вызова в Promise.all, как это?
function checkOut(items) {
return Promise.all([
getLatestOffers(),
getCustomerDetails('johndoe@gmail.com'),
sumTotal(items)
]).then(([offers, details, total]) => {
return { offers, details, total }
});
}
1 ответ
Любой метод работает. Так как 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));