javascript - 在 Promise.all 中使用同步函数有什么优势吗?

标签 javascript node.js asynchronous promise synchronous

假设我有一个像这样的同步函数:

function sumTotal(items) {
  return items.reduce((total, item) => item.price + total)
}

它在 Promise.all 之后使用,其中包含此“结帐”函数中的一些异步 API 调用

function checkout(items) {
  return Promise.all([
    getLatestOffers(),
    getCustomerDetails('johndoe@gmail.com')
  ]).then(([offers, details]) => {
    return { offers, details, total: sumTotal(items) }
  });
}

更改 sumTotal 函数以返回 Promise 并像这样在 Promise.all 中调用它,是否有任何优势(性能方面或其他方面)?

function checkOut(items) {
  return Promise.all([
    getLatestOffers(),
    getCustomerDetails('johndoe@gmail.com'),
    sumTotal(items)
  ]).then(([offers, details, total]) => {
    return { offers, details, total }
  });
}

最佳答案

这两种方法都有效。因为sumTotal是同步的,大多数情况下并不重要。唯一可能重要的是 items是一个不合理的巨大数组,迭代它需要大量的 CPU 时间 - 在这种情况下,最好调用 sumTotalPromise.all这样一旦 promise 解决,它就可以立即解决,而不是在其他 promise 解决之后等待昂贵的操作。

但是,请记住 Promise.all也接受非 Promise:无需转换 sumTotal返回 Promise 的东西.

此外,如果 items是一个包含 price 的对象数组属性(property),请务必提供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));
  

关于javascript - 在 Promise.all 中使用同步函数有什么优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030406/

相关文章:

javascript - 只删除周围的单引号?

node.js - 使用 sass 和 babel 的 Webpack 4 生产设置

c# - 异步等待新线程的行为

c# - 如何在 Blazor 中正确创建异步方法?

python - epoll 和 kqueue 之间有什么主要的性能差异吗?

javascript - 小部件 - Iframe 与 JavaScript

javascript - Lodash - 如何从平面数组创建树

javascript - React 组件不进行 ajax 调用

javascript - 生产 Node 应用程序找不到 SVG 文件

javascript - 在 Angular JS 中动态创建路由