RxJS 5和缓存运算符的替代品

Mar*_*oll 8 rxjs angularjs rxjs5 angular

在升级RxJS之前5.0.0-rc.0我使用.cache()了很多来在我的Angular应用程序中共享订阅.使用它的最大优点是任何新订阅都将获得最后发布的值.

RxJS团队决定删除它,现在我发现自己手动连接私人BehaviorSubjectReplaySubject随后打电话.asObservable().考虑到我们之前必须采用的简单方法,这似乎是很多样板.

我错过了一些更简单的方法吗?我找不到.replay()经营者,以及.share().publishReplay()运营商似乎并不做这一点.

谢谢!

mar*_*tin 7

这就是我用来炫耀RxJS的方法.以下示例缓存最新的模拟HTTP响应1秒.它基于RxJS多播通过publishReplay()refCount().

var counter = 1;
var updateTrigger = Observable.defer(() => mockDataFetch())
    .publishReplay(1, 1000)
    .refCount()
    .take(1);

function mockDataFetch() {
    return Observable.of(counter++)
        .delay(100);
}

function mockHttpCache() {
    return updateTrigger;
}

mockHttpCache().toPromise()
    .then(val => console.log("Response from 0:", val));

setTimeout(() => mockHttpCache().toPromise()
    .then(val => console.log("Response from 200:", val))
, 200);

setTimeout(() => mockHttpCache().toPromise()
    .then(val => console.log("Response from 1200:", val))
, 1200);

setTimeout(() => mockHttpCache().toPromise()
    .then(val => console.log("Response from 1500:", val))
, 1500);

setTimeout(() => mockHttpCache().toPromise()
    .then(val => console.log("Response from 3500:", val))
, 3500);
Run Code Online (Sandbox Code Playgroud)

查看现场演示:https://jsbin.com/todude/3/edit?js,console

这打印到控制台:

Response 0: 1
Response 50: 1
Response 200: 1
Response 1200: 2
Response 1500: 2
Response 3500: 3
Run Code Online (Sandbox Code Playgroud)

  • 我在SO文档中发表了一篇关于此内容的文章,详细解释了它的工作原理:http://stackoverflow.com/documentation/rxjs/8247/common-recipes/26490/caching-http-responses#t=201612161544428695958 (2认同)