我有一个reduce的实现,它可能将许多.then
处理程序链接在一起。
const reduceIterable = (fn, x0, x) => {
const iter = x[Symbol.iterator].call(x)
let cursor = iter.next()
if (cursor.done) {
throw new TypeError('reduce(...)(x); x cannot be empty')
}
let y = !isUndefined(x0) ? fn(x0, cursor.value) : (() => {
const x0 = cursor.value
cursor = iter.next()
return cursor.done ? x0 : fn(x0, cursor.value)
})()
cursor = iter.next()
while (!cursor.done) {
const { value } = cursor
y = isPromise(y) ? y.then(res => fn(res, value)) : fn(y, value)
cursor = iter.next()
}
return y
}
// you would use reduce like reduce(add, 0)([1, 2, 3]) // => 6
const reduce = (fn, x0) => {
if (!isFunction(fn)) {
throw new TypeError('reduce(x, y); x is not a function')
}
return x => {
if (isIterable(x)) return reduceIterable(fn, x0, x)
if (isAsyncIterable(x)) return reduceAsyncIterable(fn, x0, x)
if (is(Object)(x)) return reduceObject(fn, x0, x)
throw new TypeError('reduce(...)(x); x invalid')
}
}
具体来说,我在看y.then(res => fn(res, value))
。由于这个问题,这使我无法入睡。我知道自那时以来,承诺已经走了很长一段路,但这从未得到解决。我真的很想知道我是否可以使用这样的Promise API,或者是否需要做一些更难的事情。
如果
.then
在Promises上链接太多s,会对性能产生什么影响(如果有)?
如果您比较一个.reduce()
循环,在该循环中您.then()
将彼此串联在一起以对异步操作进行排序,然后将其与await
异步函数中的一个循环(在该循环中您先执行一个操作再开始下一个操作)进行比较,则主要区别在于峰值内存使用率。链接.then()
在一起将使所有promise对象的完整链一次存储在内存中。如果执行await
循环,则一次只能激活一个诺言。
现在,promise并不是大对象,因此即使您的链长成千上万个元素,它也可能仍然没有实质性的区别。但是,如果要最大程度地减少峰值内存使用量,则await
循环将使峰值内存使用量降低。
至于纯粹的执行速度,故事一如既往。如果您真正关心执行速度,则必须使用.reduce()
循环编写一个代表性的测试程序,并使用一个await
循环生成等效的输出和排序的程序,并对两者进行基准测试。性能是如此取决于特定的环境,如果您真的想知道哪个更快,则必须衡量。理论化通常是错误的,因为我们的直觉并不总是知道真正的瓶颈是什么。你必须测量。
仅供参考,async/await
在最近的几个nodejs版本中已经加速了很多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句