假设我有一个像这样的同步函数:
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 时间 - 在这种情况下,最好调用 sumTotal
与 Promise.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/