AngularJS 2/4 中 BehaviourSubject 中的 HTTP 响应缓存和下一步

Posted

技术标签:

【中文标题】AngularJS 2/4 中 BehaviourSubject 中的 HTTP 响应缓存和下一步【英文标题】:HTTP response caching and nexting in BehaviourSubject in AngularJS 2/4 【发布时间】:2018-03-15 12:13:32 【问题描述】:

我有 2 个同级组件具有一个服务,该服务具有 HTTP 调用来呈现 json。 OnInit,组件 B 获取调用服务的 HTTP 响应并加载屏幕。 组件 A 上的点击事件,应该使组件 B 刷新其数据。

我按照 ObjectiveTC 发布的答案来自 -> What is the correct way to share the result of an Angular 2 Http network call in RxJs 5?

    _docdata: BehaviorSubject<DetailSection[]> = new BehaviorSubject<DetailSection[]>([]);

service.getData()return  this.http.get(this.url)
        .map((res) =>this._docdata = (res.json()); console.log("1st return"); return this._docdata; )     
        .catch((error:any) => Observable.throw(error|| 'Server error'));  

这很好用。

refresh()
this.http.get("../../assets/reqd-detail.json")
        .map(res => res.json())
        .subscribe((data:Array<DetailSection>) => this._docdata.next(data));

出现错误 --> ERROR TypeError: _this._docdata.next is not a 功能 在 SafeSubscriber._next (detail.service.ts:156) 在 SafeSubscriber.webpackJsonp.../../../../rxjs/Subscriber.js.SafeSubscriber.__tryOrUnsub (订阅者.js:238) 在 SafeSubscriber.webpackJsonp.../../../../rxjs/Subscriber.js.SafeSubscriber.next (订阅者.js:185) 在 Subscriber.webpackJsonp.../../../../rxjs/Subscriber.js.Subscriber._next (订阅者.js:125) 在 Subscriber.webpackJsonp.../../../../rxjs/Subscriber.js.Subscriber.next (

【问题讨论】:

【参考方案1】:

问题在于您的地图函数内部,您将 _docData 覆盖到响应对象(即数组类型),而不是可观察的。而且那上面没有下一个功能。

试试这个

_docdata: BehaviorSubject<DetailSection[]>;

service.getData()return  this.http.get(this.url)
        .map((res) =>
             let detailSections = res.json();
             this._docdata = new BehaviorSubject<DetailSection[]>(detailSections); 
             console.log("1st return"); 
             return detailSections; )     
            .catch((error:any) => Observable.throw(error|| 'Server error'));  

【讨论】:

感谢您的回复。但是我在 refresh() 方法中遇到 _docdata.next() 错误 Error => ERROR TypeError: _this._docdata.next is not a function 是的,您在刷新时遇到错误的原因是因为在 getData 中您使用不使用 BehaviourSubject 的对象初始化了 _docData。上面的代码你试过了吗? 现在 refresh() 工作正常。但是 getData() 没有呈现响应。 refresh () return this.http.get("../../assets/reqd-detail.json") .map(res => res.json()) .subscribe((data:DetailSection[]) = > this._docdata.next(data);console.log(this._docdata), (err: any) => console.error("fetch: ERROR",err), () => console.log("获取:总是“)); 你是直接使用getData还是通过_docData? 它应该返回值,因为我们除了将它分配给 _docData 之外,还返回来自 get 的任何响应。您是否复制了整个代码,特别是最后一行 return detailSections?【参考方案2】:

下面的代码对我来说很好。

主题变量

_docdata: BehaviorSubject = new BehaviorSubject([]); docdata: Observable = this._docdata.asObservable();

getData() / refresh() return this.http.get(this.url) .map(res => res.json()) .subscribe((data:DetailSection[]) => this._docdata.next(data);console.log(this._docdata), (err: any) => console.error("fetch: ERROR",err), () => console.log("fetch: always"));

在组件中获取响应为:

this.detailService.getPageData(key,srcFrom); this.detailService.docdata.subscribe((dataList) => this.dataList = dataList;console.log("dataList from component",this.dataList););

【讨论】:

以上是关于AngularJS 2/4 中 BehaviourSubject 中的 HTTP 响应缓存和下一步的主要内容,如果未能解决你的问题,请参考以下文章

如何从已弃用的 Supervisor.spec 更新为新的 Supervisor.behaviour?

Unity笔记Behaviour Designer的使用方法

Behaviour-Driven Development from Cucumber

Behaviour Tree Service 中的几个函数

带有appbar_scrolling_behaviour的appbar下方的BottomSheet

AngularJS 2/4 中 BehaviourSubject 中的 HTTP 响应缓存和下一步