Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 平均角度5,插座IO工作流程_Angular_Socket.io_Real Time_Angular5_Mean - Fatal编程技术网

Angular 平均角度5,插座IO工作流程

Angular 平均角度5,插座IO工作流程,angular,socket.io,real-time,angular5,mean,Angular,Socket.io,Real Time,Angular5,Mean,我以前在Angular5上使用Meteor,它工作得相当好,但我发现Meteor有点限制。因此,我试图将我的应用程序重构为一个平均完整的堆栈 我试图与数据库进行实时交互,所以我使用socket.io 我已经让它工作,但我想得到一些意见,这是一个好的工作流程,还是我可以做得更好?。。这是我当前的工作流程: 作业.组件 ngOnInit(){ 这个.resetJob(); //加载数据库中当前的所有作业 这是。_jobService.getAllJobs() .订阅(作业=>{ 这个.工作=工作;

我以前在Angular5上使用Meteor,它工作得相当好,但我发现Meteor有点限制。因此,我试图将我的应用程序重构为一个平均完整的堆栈

我试图与数据库进行实时交互,所以我使用socket.io

我已经让它工作,但我想得到一些意见,这是一个好的工作流程,还是我可以做得更好?。。这是我当前的工作流程:

作业.组件

ngOnInit(){
这个.resetJob();
//加载数据库中当前的所有作业
这是。_jobService.getAllJobs()
.订阅(作业=>{
这个.工作=工作;
});
//追加新增加的工作
这是。_jobService.getNewJobs()
.订阅(作业=>{
这个.jobs.push(作业);
})
}
就业服务

getAllJobs(){
返回这个.http.get('/api/job');
}
getNewJobs(){
让可观察=新可观察(观察者=>{
this.socket.on('jobsadded',(作业:any)=>{
观察员:下一个(工作);
});
return()=>{
this.socket.disconnect();
};
})
可观测收益;
}
创建作业(作业){
this.socket.emit('add-job',job');
}
index.js

io.on('connection',(socket)=>{
console.log('User connected');
//每当用户断开连接时记录
socket.on('disconnect',function()){
console.log('User disconnected');
});
socket.on('add-job',(job)=>{
io.emit('jobsadded',job);
//将作业存储在数据库中
db.createJob(job);
});
});

好的,现在我通过socketIO加载所有内容,因此每当有CRUD操作时,我都会重新获取所有作业并将它们返回到我的作业服务。这似乎可行,但这是一个好的工作流程吗?否则我会考虑使用Firebase

index.js(我将把它移到一个单独的js文件中)

job.service.ts

getAllJobs() {
  this.socket.emit('getJobs');

  let observable = new Observable(observer => {

    this.socket.on('jobs', (jobs: any[]) => {
      observer.next(jobs);
    });
    return () => {
      this.socket.disconnect();
    };
  })
  return observable;
}

实际上,考虑到这一点,我不确定如何删除一个文档并为所有用户实时更新。。。我是否需要在每次创建、更新或删除作业时调用我的数据库,获取所有作业并将它们发送到我的组件?有人能告诉我怎么做吗?与任何其他
事件的流程相同。删除文档=>后端处理请求,更新数据库,发出
deleteEvent
=>前端在希望实时更新作业的位置侦听该
deleteEvent
。如果用户在该
组件中
,他们将实时看到更改,如果不是,下次点击该组件时,他们将看到更改。所有CRUD操作都是一样的,因为我从我的服务返回一个可观察的对象,我如何从我的集合中更新一个对象?为什么有
getAllJobs()
getNewJobs()
?从设计的角度来看,最好让您的套接字正好在那里发出和监听事件。当您添加新作业时,您希望发出一个事件
jobdadded
。你为什么不听一下这个事件,然后使用
getAllJobs()
重新获取作业呢?如果在前端添加了
新作业
,您打算怎么办?那么,每当创建、更新或删除作业时,我是否应该在套接字上发出一个事件,然后从数据库中重新获取所有作业并每次返回该事件?所以我的作业每次都会更新?这似乎是一种蛮力,我想知道是否有其他方法可以做到这一点,也许你只需要重新获取新的作业或更新或通过删除的作业过滤可观察到的内容,但也许这是不可能的。。?新作业将添加到“作业”组件中的“作业”列表中,但我希望在没有任何人刷新页面的情况下为所有用户显示新作业,这是否过于复杂了?
getAllJobs() {
  this.socket.emit('getJobs');

  let observable = new Observable(observer => {

    this.socket.on('jobs', (jobs: any[]) => {
      observer.next(jobs);
    });
    return () => {
      this.socket.disconnect();
    };
  })
  return observable;
}