Angular2 RxJS – 为模拟服务创建一个observable
我有一个包含任务集合的模拟文件,每个任务都有截止日期.目前(下面)我创建了一个简单的observable,当订阅时,它返回模拟任务的集合.我未能弄清楚的是我如何处理平面数组的任务以按截止日期对它们进行分组,返回一个类似的结构;
// Current data structure (unstructured) [{due: "2016-01-01"},{due: "2016-01-01"},{due: "2016-01-02"},...] // Desired structure for consumption { "2016-01-01": [{...},{...}],"2016-01-02": [{...},{...},"2016-01-03": [{...}] } 我目前的可观察创作代码如下; // Service... tasks: Observable<Task[]>; // init() called from the constructor private init() { this.tasks = Observable.create(observer => { observer.next(mockTasks); }); } getTasks() { return this.tasks; } 在我的组件中消耗的如下; // Component... ngOnInit() { this.taskService.getTasks().subscribe(tasks => { this.tasks = tasks; // Contains the collection of tasks as expected }); } 这很好 – 我按照预期完成了我的完整任务.我已经尝试使用groupBy运算符来实现上述目的,但是通过Observable.create()创建的observable似乎没有可用的方法.我一直在指this resource尝试实现这一点,我注意到使用了Observable.from()而不是.create(),但是这似乎也不是我服务中的可用函数. >使用RxJS运算符(例如groupBy)如何格式化数据(如何实现)?或者应该手动格式化? 谢谢! 解决方法
我猜,你混合了几件事. Observables总是有时间因素,所以你可以通过一个可观察的东西随着时间的推移发出一些东西.如果您只想在静态数组中对事物进行分组,则可观察对象是错误的.
在你的情况下你有几个dats const tasks = [ {due: "2016-01-01"},{due: "2016-01-02"} ]; 如果你要将它们放在一个Observable中,这是可能的,但它只会输出一次数组,就是这样. const observable = Rx.Observable.of(tasks); observable.subscribe(x => console.log('All at once',x)); // output: All at once [ {due: "2016-01-01"},{due: "2016-01-02"} ]; 如果你想及时分发它们 – 现在我们越来越接近Observables的用途 – 你也可以这样做 const observable2 = Rx.Observable.from(tasks); observable2.subscribe(x => console.log('One after the other',x)); // output: 'One after the other' {due: "2016-01-01"} // 'One after the other' {due: "2016-01-01"} // 'One after the other' {due: "2016-01-02"} 现在让我们假设我们有一个数据源,偶尔提供一个新任务,我们希望随着时间的推移对它们进行分组. const observable3 = Rx.Observable.from(tasks); observable3 .scan((acc,obj) => { let oldValue = acc[obj.due] || 0; acc[obj.due] = ++oldValue; return acc; },{}) .subscribe(x => console.log(x)); // output: { 2016-01-01: 1 } // { 2016-01-01: 2 } // { 2016-01-01: 2,2016-01-02: 1 } 因此,根据您的需求,Observables可能是正确的.如果数据及时分发,则完全可以将它们分组,如上所示.我有uploaded the code to jsbin玩它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |