在Promise.all内部使用其他同步功能是否有优势?

时间:2018-08-26 21:29:52

标签: javascript node.js asynchronous promise synchronous

说我有一个这样的同步功能:

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

它在Promise之后使用。所有在此'checkout'函数中包含一些异步API调用

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

无论是性能方面还是其他方面,更改sumTotal函数以返回Promise并在Promise中调用它是否有任何优势?

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

1 个答案:

答案 0 :(得分:2)

这两种方法均有效。因为sumTotal是同步的,所以在大多数情况下都没有关系。唯一可能的问题是items是否是一个不合理的巨大数组,并且对其进行迭代需要花费不小的CPU时间-在这种情况下,最好调用sumTotalPromise.all一起使用,以便一旦承诺达成后,它就可以立即解决,而不必等到其他承诺解决后,便要等待昂贵的操作

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

此外,如果items是具有price属性的对象数组,请确保为reduce提供初始值,否则可能会得到类似{{1 }}用作您的[Object object]102030

total