说我有一个这样的同步功能:
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 }
});
}
答案 0 :(得分:2)
这两种方法均有效。因为sumTotal
是同步的,所以在大多数情况下都没有关系。唯一可能的问题是items
是否是一个不合理的巨大数组,并且对其进行迭代需要花费不小的CPU时间-在这种情况下,最好调用sumTotal
与Promise.all
一起使用,以便一旦承诺达成后,它就可以立即解决,而不必等到其他承诺解决后,便要等待昂贵的操作
但是,请记住,Promise.all
也接受非承诺:无需将sumTotal
转换为返回Promise
的内容。
此外,如果items
是具有price
属性的对象数组,请确保为reduce
提供初始值,否则可能会得到类似{{1 }}用作您的[Object object]102030
:
total