Javascript 在Promise.all中使用其他同步函数是否有好处?

Javascript 在Promise.all中使用其他同步函数是否有好处?,javascript,node.js,asynchronous,promise,synchronous,Javascript,Node.js,Asynchronous,Promise,Synchronous,假设我有这样一个同步函数: function sumTotal(items) { return items.reduce((total, item) => item.price + total) } 它是在Promise.all之后使用的,在这个“checkout”函数中包含一些异步API调用 function checkout(items) { return Promise.all([ getLatestOffers(), getCustomerDetails(

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

function sumTotal(items) {
  return items.reduce((total, item) => item.price + total)
}
它是在Promise.all之后使用的,在这个“checkout”函数中包含一些异步API调用

function checkout(items) {
  return Promise.all([
    getLatestOffers(),
    getCustomerDetails('johndoe@gmail.com')
  ]).then(([offers, details]) => {
    return { offers, details, total: sumTotal(items) }
  });
}
更改sumTotal函数以返回一个承诺并在承诺中调用它有什么好处(性能方面还是其他方面)

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

这两种方法都有效。因为
sumTotal
是同步的,所以在大多数情况下这并不重要。唯一重要的时间是,如果
items
是一个不合理的庞大数组,并且迭代它需要相当多的CPU时间-在这种情况下,最好使用
Promise.all调用
sumTotal
,以便在承诺解决后立即解决,而不是在其他承诺解决后等待昂贵的手术

但是,请记住,
承诺。所有
也接受非承诺:不需要将
sumTotal
转换为返回承诺的内容

此外,如果
项目
是一个具有
价格
属性的对象数组,请确保为
减少
提供初始值,否则您的
总计
可能会得到类似
[Object Object]102030的值:

constsomethingasync=()=>newpromise(res=>setTimeout(res,500,'foo'));
功能总计(项目){
退货项目.减少((合计,项目)=>item.price+total,0)
}
功能签出(项目){
回报你的承诺([
somethingAsync(),
有什么事吗johndoe@gmail.com'),
总计(项目)
])。然后(([报价、详细信息、总计])=>(
{报价、详细信息、总计}
));
}
console.log('start');
结帐([{price:10},{price:20}])
.then(output=>console.log(output));

两种方法都有效。因为
sumTotal
是同步的,所以在大多数情况下这并不重要。唯一重要的时间是,如果
items
是一个不合理的庞大数组,并且迭代它需要相当多的CPU时间-在这种情况下,最好使用
Promise.all调用
sumTotal
,以便在承诺解决后立即解决,而不是在其他承诺解决后等待昂贵的手术

但是,请记住,
承诺。所有
也接受非承诺:不需要将
sumTotal
转换为返回承诺的内容

此外,如果
项目
是一个具有
价格
属性的对象数组,请确保为
减少
提供初始值,否则您的
总计
可能会得到类似
[Object Object]102030的值:

constsomethingasync=()=>newpromise(res=>setTimeout(res,500,'foo'));
功能总计(项目){
退货项目.减少((合计,项目)=>item.price+total,0)
}
功能签出(项目){
回报你的承诺([
somethingAsync(),
有什么事吗johndoe@gmail.com'),
总计(项目)
])。然后(([报价、详细信息、总计])=>(
{报价、详细信息、总计}
));
}
console.log('start');
结帐([{price:10},{price:20}])
.then(output=>console.log(output));

最大的区别在于计时。在第一个版本中,
sumTotal(items)
getLatestOffers()
getCustomerDetails()在同一事件回合中计算johndoe@gmail.com)
进行了调用。在第二个版本中,当
getLatestOffers()
getCustomerDetails()时,在事件回合中计算
sumTotal(items)
johndoe@gmail.com)
交付异步派生的结果。这两个值之间可能存在差异,并且没有唯一的答案,哪一个更合适。最大的差异是时间。在第一个版本中,
sumTotal(items)
getLatestOffers()
getCustomerDetails()在同一事件回合中计算johndoe@gmail.com)
进行了调用。在第二个版本中,当
getLatestOffers()
getCustomerDetails()时,在事件回合中计算
sumTotal(items)
johndoe@gmail.com)
交付异步派生的结果。这两个值之间可能存在差异,并且没有唯一的答案,哪一个更合适。