gpt4 book ai didi

javascript - 如何以缓存方式迭代 Cold Observable

转载 作者:行者123 更新时间:2023-12-03 08:10:03 26 4
gpt4 key购买 nike

我想实现 relative complement两个有限的 Observable 序列,这是我迄今为止得到的最好的:

function relativeComplement (setA, setB, cmp) {

return setA.concatMap(objA =>
setB
.reduce((acc, cur) => {
if (cmp(objA, cur)) {
return {val: objA, skip:true}
}
return acc
}, {val: objA, skip: false})
.filter(obj => !obj.skip)
.map(obj => obj.val)
)
}

该示例有效,但有两个我无法克服的问题。首先,我想使用scan而不是reduce,因为我知道如果我已经将skip设置为true,那么继续序列就没有意义了。

第二个问题是最困扰我的问题。

如果 setB 是一个冷可观察对象,它将“构造它”,或者执行它可能多次附加 setA.length 的任何副作用。

这是一个jsbin这说明了问题

所以我有两个问题。

  • 您是否看到另一种实现相对补集来克服这两个问题的方法?

  • 我可以缓存 setB 的结果,这样它就不会重播构造和副作用吗?

注意:我使用的是 RxJs 5 alpha,它在可观察原型(prototype)中没有重播方法

最佳答案

如果你继续在数组想法中转换可观察量,并假设你有一个函数relativeComplementArray:

function relativeComplement (setA, setB, cmp) {
return Rx.Observable.forkJoin(setA.toArray(), setB.toArray(), function (arrayA, arrayB){
return relativeComplementArray(arrayA, arrayB, cmp);
})
}

对于具有 replay 功能的版本,在函数中使用它会稍微复杂一些,因为您需要的不是 setB 而是 setB.shareReplay().

我向您推荐一个柯里化(Currying)函数。

function relativeComplement ( setB, cmp ) {
var sharedSetB = setB.shareReplay();
return function ( setA ) {
return Rx.Observable.forkJoin(setA.toArray(), sharedSetB.toArray(), function ( arrayA, arrayB ) {
return relativeComplementArray(arrayA, arrayB, cmp);
})
}
}

这一切都未经测试,但希望它能让您朝着正确的方向前进。

关于javascript - 如何以缓存方式迭代 Cold Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34182783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com