Есть ли преимущество в использовании синхронной функции внутри 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));
  

Другие вопросы по тегам