Есть ли преимущество в использовании синхронной функции внутри Promise.all? - PullRequest
0 голосов
/ 27 августа 2018

Скажем, у меня есть синхронная функция, подобная этой:

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 Ответ

0 голосов
/ 27 августа 2018

Любой метод работает.Поскольку 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));
  
...