使用 'CRUD-Observables' 高效地维护一组对象
Efficiently maintain a set of objects with 'CRUD-Observables'
我一直在试验 feathersjs 和 angular2/Rx。
我想要实现的是构建一个 angular2 服务,它以这样一种方式包装 feathersjs 服务,即人们可以只订阅一个 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 有点难以理解。
你们会如何尝试实现这一目标?
我认为您正在寻找的正是 feathers-reactive 应该做的。它是一个插件,可以将任何服务方法转换为 RxJS 可观察对象,自动更新实时事件。可以这样使用:
const feathers = require('feathers');
const memory = require('feathers-memory');
const rx = require('feathers-reactive');
const RxJS = require('rxjs');
const app = feathers()
.configure(rx(RxJS))
.use('/messages', memory());
const messages = app.service('messages');
messages.create({
text: 'A test message'
}).then(() => {
// Get a specific message with id 0. Emit the message data once it resolves
// and every time it changes e.g. through an updated or patched event
messages.get(0).subscribe(message => console.log('My message', message));
// Find all messages and emit a new list every time anything changes
messages.find().subscribe(messages => console.log('Message list', messages));
setTimeout(() => {
messages.create({ text: 'Another message' }).then(() =>
setTimeout(() => messages.patch(0, { text: 'Updated message' }), 1000)
);
}, 1000);
});
如果您想尝试一下,我们很乐意收到一些反馈(和错误报告)。
我一直在试验 feathersjs 和 angular2/Rx。 我想要实现的是构建一个 angular2 服务,它以这样一种方式包装 feathersjs 服务,即人们可以只订阅一个 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 有点难以理解。
你们会如何尝试实现这一目标?
我认为您正在寻找的正是 feathers-reactive 应该做的。它是一个插件,可以将任何服务方法转换为 RxJS 可观察对象,自动更新实时事件。可以这样使用:
const feathers = require('feathers');
const memory = require('feathers-memory');
const rx = require('feathers-reactive');
const RxJS = require('rxjs');
const app = feathers()
.configure(rx(RxJS))
.use('/messages', memory());
const messages = app.service('messages');
messages.create({
text: 'A test message'
}).then(() => {
// Get a specific message with id 0. Emit the message data once it resolves
// and every time it changes e.g. through an updated or patched event
messages.get(0).subscribe(message => console.log('My message', message));
// Find all messages and emit a new list every time anything changes
messages.find().subscribe(messages => console.log('Message list', messages));
setTimeout(() => {
messages.create({ text: 'Another message' }).then(() =>
setTimeout(() => messages.patch(0, { text: 'Updated message' }), 1000)
);
}, 1000);
});
如果您想尝试一下,我们很乐意收到一些反馈(和错误报告)。