【问题标题】:Is there an advantage to using an otherwise synchronous function inside a Promise.all?在 Promise.all 中使用其他同步函数是否有优势?
【发布时间】:2019-02-01 11:11:18
【问题描述】:

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

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) 在与getLatestOffers()getCustomerDetails('johndoe@gmail.com') 调用相同的事件轮次中计算。在第二个版本中,sumTotal(items)getLatestOffers()getCustomerDetails('johndoe@gmail.com') 传递它们的异步派生结果时在事件轮次中计算。 可能这两个值之间存在差异,并且没有唯一的答案来说明哪个值可能更合适。

标签: javascript node.js asynchronous promise synchronous


【解决方案1】:

任何一种方法都有效。因为sumTotal 是同步的,所以在大多数情况下都无关紧要。 可能唯一重要的是items是一个不合理的巨大数组,并且迭代它需要相当多的CPU时间 - 在这种情况下,最好调用@987654323 @ 和 Promise.all 以便它可以在承诺解决后立即解决,而不必在其他承诺解决之后等待昂贵的操作

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

另外,如果items 是具有price 属性的对象数组,请确保为reduce 提供初始值,否则您的total 可能最终会得到类似[Object object]102030 的内容:

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));
  

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多