当前位置: 首页 > 知识库问答 >
问题:

如何缓存和共享 Http get() 响应?[重复]

哈沛
2023-03-14

遵循本课程https://www.pluralsight.com/courses/angular-2-getting-started和github材料产品。服务试图避免调用http。每次单击链接时都会请求get()。我认为每次加载文件而不是将其保存为内存中的对象是一种很大的浪费。

正在尝试替换此代码:

    getProducts(): Observable<IProduct[]> {
    return this._http.get(this._productUrl)
        .map((response: Response) => <IProduct[]> response.json())
        .do(data => console.log('All: ' +  JSON.stringify(data)))
        .catch(this.handleError);
}

用这个:

    public _observable: Observable<IProduct[]>;

    getProducts(): Observable<IProduct[]> {
    console.log('_observable before: ' + (this._observable));
    if(this._observable===undefined){
        console.log('_observable inside 1: ' + (this._observable));
        this._observable=this._http.get(this._productUrl)
            .map((response: Response) => <IProduct[]> response.json())
            .do(data => console.log('All inside observable: ' +  JSON.stringify(data)))
            .catch(this.handleError);
        console.log('_observable inside 2: ' + (this._observable));
    }

    console.log('_observable after: ' + (this._observable));
    return this._observable;
}

如果this._observable被低估,则永远不应调用此行 this._observable=this._http.get(this._productUrl)

但它被称为!!!!

在镀铬控制台中:

_observable before: [object Object]
product.service.ts:25 _observable after: [object Object]
product.service.ts:20 All inside observable:...

最后一行不应该出现!

共有3个答案

壤驷彦
2023-03-14

为了避免加载文件,您需要在 if 语句中包含代码行:

            .publishReplay(1)
            .refCount()

完整的代码在这里:

    getProducts(): Observable<IProduct[]> {
    console.log('_observable before: ' + (this._observable));
    if(this._observable===undefined){
        console.log('_observable inside 1: ' + (this._observable));
        this._observable=this._http.get(this._productUrl)
            .map((response: Response) => <IProduct[]> response.json())
            .publishReplay(1)
            .refCount()
            .do(data => console.log('All inside observable: ' +  JSON.stringify(data)))
            .catch(this.handleError);
        console.log('_observable inside 2: ' + (this._observable));
    }

    console.log('_observable after: ' + (this._observable));
    return this._observable;
}
司马建柏
2023-03-14

对于您的代码

 getProducts(): Observable<IProduct[]> {
return this._http.get(this._productUrl)
    .map((response: Response) => <IProduct[]> response.json())
    .publishReplay(1)
     .refCount()
    .do(data => console.log('All: ' +  JSON.stringify(data)))
    .catch(this.handleError);
}

现在你不需要考虑这些条件。publishReplay,refCount将在所有观察者之间共享相同的状态。所以publishReplay将帮助您缓存数据,refCount将帮助观察者可用。

呼延智明
2023-03-14

_observable before是日志中的对象。而“最后一行”评论在if-else之外。为什么不尝试:

    if (!Object.keys(this._observable).length) {
   console.log('_observable inside 1: ' + (this._observable));
    this._observable=this._http.get(this._productUrl)
        .map((response: Response) => <IProduct[]> response.json())
        .do(data => console.log('All inside observable: ' +  JSON.stringify(data)))
        .catch(this.handleError);
        console.log('_observable inside 2: ' + (this._observable));
        return this._observable;
   } else {
        console.log('_observable after: ' + (this._observable));
        return this._observable;
   }
 类似资料:
  • 我有两个应用程序使用相同的数据库实体。这两个应用程序都部署在jboss eap 6.2独立的集群上。DB表仅从一个应用程序中更新,但从两个应用程序中读取。这两个应用程序都使用本机hibernate API从数据库读取/写入数据。 在嵌入式模式下将infinispan启用为2LC后,如何确保在一个应用程序中更新的缓存实体从第二个应用程序缓存中失效?是否有任何JMX/JMS接口用于信号缓存失效? 若我

  • 我有一个Spring应用程序,它使用MyBatis进行持久化。我使用ehcache是因为速度对于这个应用程序很重要。我已经设置并配置了MyBatis和Ehcache。我使用一个名为“mybatis”的单一缓存,因为否则为每个实体创建单独的缓存将是荒谬的。 这是我的电子缓存。xml。 这是我的mybatis映射器界面的一个示例。 因为我有一个共享缓存,所以我需要一种方法使我的密钥对域对象是唯一的。作

  • 问题内容: 我对ES官方文档中的以下配额有一个疑问: 如果服务器具有80G内存,则发出以下命令以启动ES节点: 这意味着我只给ES进程提供最大30g内存。Lucene如何使用剩余的50G,因为Lucene在ES流程中运行,所以这只是流程的一部分。 问题答案: 该参数仅指示您为ES Java进程分配了多少 堆 。但是,将RAM分配给堆并不是使用服务器上可用内存的唯一方法。 Lucene确实在ES进程

  • 我正在使用WildFly 8.1,所以JPA 2.1和Hibernate 4.3.5 我想在WildFly中使用JPA共享缓存/二级缓存 我遵循WildFly文档:https://docs.jboss.org/author/display/WFLY8/JPA参考指南#使用InfinispanSecondlevelCache的JPA参考指南 这是我的persitience.xml: 我将属性设置为h

  • 我正在使用FB。允许用户使用此代码共享我的页面的ui: 当从 Android 移动应用程序中的嵌入式浏览器共享页面时,用户可以选择要用于打开共享对话框的应用程序。如果选择了脸书应用,则不会有回调响应。在普通的桌面浏览器中,一切都按预期工作。这种行为是预期的吗?

  • 问题内容: 我想确保浏览器永远不会缓存服务器的响应,这样即使发出两个相同的请求(相隔一纳秒),也始终会与服务器联系。这是实现此目标的正确方法: 谢谢唐 问题答案: 不,那不是正确的方法。这是正确的方法: 您可能会看到其他人在建议其他条目/属性,但是当至少提及上述内容时,它们是完全不相关的。 更改后,请不要忘记在测试之前清除浏览器缓存。 也可以看看: 网站站长缓存教程