我一直在尝试使用 feathersjs 和 angular2/Rx。我想要实现的是构建一个 angular2 服务,该服务以这样一种方式包装一个 feathersjs 服务,即人们可以订阅一个 Observable,该 Observable 在任何类型的 CRUD 之后发出一组最新的项目。
它基本上有效。但是,我发现它的完成方式并不优雅:包装和展开每个传入的对象似乎效率不高。我是否将“一切都是流”走得太远了?
getService(){
let data$: Observable<any> = Observable.from([initialSetOfItems]);
let created$: Observable<any> = Observable.fromEvent(feathersService, 'created').map(o => {return {action: 'c', data: o}});
let updated$: Observable<any> = Observable.fromEvent(feathersService, 'updated').map(o => {return {action: 'u', data: o}});
let removed$: Observable<any> = Observable.fromEvent(feathersService, 'removed').map(o => {return {action: 'r', data: o}});
return data$
.merge(created$, updated$, removed$)
.scan((arr: any[], newObj) => {
switch (newObj.action){
case 'c':
return [].concat(arr, newObj.data);
case 'u':
let indexToUpdate = arr.findIndex((element) => (element.id === newObj.data.id));
if (indexToUpdate > -1){
arr[indexToUpdate] = newObj.data;
}
return arr;
case 'r':
return arr.filter(element => (element.id != newObj.data.id))
}
});
}
我知道这可能是固执己见。请多多包涵。Rx 有点难以理解。
你们将如何尝试实现这一目标?