Node.js 需要关于使用TakeTill()和Observable.fromEvent()方法的帮助吗

Node.js 需要关于使用TakeTill()和Observable.fromEvent()方法的帮助吗,node.js,rxjs,Node.js,Rxjs,我将在Nodejs中创建反应式TCP服务器 这是我一直在研究的代码 const Rx=require('rxjs') const net=require('net') const uuid=require('uuid'); module.exports=()=>{ const sockets=新映射(); const id=new Map(); const GetSocket=\u id=>sockets.get(\u id); const GetId=\u socket=>ids.get(\

我将在Nodejs中创建反应式TCP服务器

这是我一直在研究的代码

const Rx=require('rxjs')
const net=require('net')
const uuid=require('uuid');
module.exports=()=>{
const sockets=新映射();
const id=new Map();
const GetSocket=\u id=>sockets.get(\u id);
const GetId=\u socket=>ids.get(\u socket);
const SetSocket=\u socket=>{
_socket.setEncoding('utf8');
常数_id=uuid();
sockets.set(_id,_socket);
id.set(_套接字,_id);
返回_id;
};
const server=net.createServer({allowHalfOpen:true});
const socketStream=Rx.Observable.fromEvent(服务器,“连接”);
const RemoveSocket=socket=()=>{
log(“连接关闭&从映射中删除套接字”);
const id=ids.get(套接字);
删除(id);
删除(套接字)
};
const socketObservable=socket=>SetSocket(socket)&&
可观测
.的({
动作:'连接',
套接字:GetId(套接字)
})
.合并(
可观测
.fromEvent(套接字,'data')
.map(d=>{
尝试{return JSON.parse(d);}
捕获(e){
控制台日志(e);
返回d;
}
})
.map(msg=>{
返回Object.assign({action:msg,socket:GetId(socket)})
})
)
.takeUntil(Rx.Observable.fromEvent(socket,'close').map(d=>{
console.log(“!!!!应该删除!!!”);
移除插座(插座);
}));
常量打印=()=>{
//forEach(id=>console.log(GetSocket(id));
日志(“总连接插座:+ids.size”);
};
const startServer=port=>server.listen(端口)&&
socketStream
.flatMap(socketObservable);
返回{startServer,Print,stop:()=>server.close()};

};所以我的困惑是理解
'close'
'end'
事件

'end'
当客户端断开连接或服务器调用socket.end(..)
时,会触发事件

socket.destroy()之后调用
'close'
事件

如果有人想看到所有套接字事件都在运行,我建议观看

@布兰农,谢谢你指出了正确的事件用法,谢谢大家,谢谢你们在这方面帮助我

另外,以防万一,任何人都想使用TCP服务器代码

依赖项:rxjs 5.5.0

const Rx=require('rxjs');
const net=require('net');
const uuid=require('uuid');
module.exports=()=>{
const sockets=新映射();
const id=new Map();
const GetSocket=\u id=>sockets.get(\u id);
const GetId=\u socket=>ids.get(\u socket);
const SetSocket=\u socket=>{
_socket.setEncoding('utf8');
常数_id=uuid();
sockets.set(_id,_socket);
id.set(_套接字,_id);
返回_id;
};
const server=net.createServer({allowHalfOpen:true});
const socketStream=Rx.Observable.fromEvent(服务器,“连接”);
const RemoveSocket=socket=>{
const id=ids.get(套接字);
删除(id);
删除(套接字)
log(“[server.js]套接字已关闭…”);
};
const socketObservable=socket=>SetSocket(socket)&&
可观测
.的({
动作:'连接',
套接字:GetId(套接字)
})
.合并(
可观测
.fromEvent(套接字,'data')
.map(d=>{
尝试{return JSON.parse(d);}
捕获(e){
控制台日志(e);
返回d;
}
})
.map(msg=>{
返回Object.assign({action:msg,socket:GetId(socket)})
})
)
.takeUntil(Rx.Observable.fromEvent(套接字,'end'))
.map(()=>RemoveSocket(套接字));
常量打印=()=>{
//forEach(id=>console.log(GetSocket(id));
//ids.clear();
日志(“总连接插座:+ids.size”);
};
const startServer=port=>server.listen(端口)&&
socketStream
.flatMap(socketObservable);
log(“[server.js]启动”);
返回{startServer,Print,stop:()=>server.close()};

};刚刚用Rx.Observable.timer()测试了takeUnitl()方法,效果很好。我认为问题在于使用Rx.Observable.fromEvent(socket,'close')…我看不出您在
startServer中订阅了
您的Observable.fromEvent(socket,'close').map(…)
但是你没有从
map
的回调返回任何东西。@Brandon我的订阅代码在另一个模块中。@martin-hmm我想
map()
方法可以返回任何东西。这意味着在我的代码中,它返回一个接受“close”evnet并返回void函数的方法。通过将
takeUntil()
行更改为此
.takeUntil(Rx.Observable.timer(5000).map(=>RemoveSocket(socket))工作正常。