Socket.io rxjs:如何通过可观察对象排序响应

Socket.io rxjs:如何通过可观察对象排序响应,socket.io,rxjs,Socket.io,Rxjs,我正在使用socket.io向前端发送一系列响应。响应是按顺序进行的,但根据socket.io创建的连接,不能保证它们总是以正确的顺序出现() 假设每个响应都有一个序列字段,其中包含一个数字(如上图中的数字所示),则可观察对象应按顺序发出这些响应 如果接收到的响应不正常,并且经过一定时间(n)没有得到任何响应,我希望我的observable发出错误,向我的前端发送信号以重置连接。这是一个非常好的问题。下面是评论了最重要部分的片段 //模拟有序值 const mockMessages=Rx.Ob

我正在使用socket.io向前端发送一系列响应。响应是按顺序进行的,但根据socket.io创建的连接,不能保证它们总是以正确的顺序出现()

假设每个响应都有一个序列字段,其中包含一个数字(如上图中的数字所示),则可观察对象应按顺序发出这些响应


如果接收到的响应不正常,并且经过一定时间(n)没有得到任何响应,我希望我的observable发出错误,向我的前端发送信号以重置连接。

这是一个非常好的问题。下面是评论了最重要部分的片段

//模拟有序值
const mockMessages=Rx.Observable.fromEvent(document.querySelector('emit'),'click'))
.map((e,索引)=>({
指数
时间戳:例如时间戳
}))
.delayWhen(()=>Rx.Observable.timer(Math.random()*2000))//扭曲顺序
//“keepOrder”中有很多易变性,但它们都是
//密封,不会泄漏到外部环境
const keepOrder=timeoutMs=>stream=>
Rx.Observable.defer(()=>//需要defer来支持错误重试
流扫描((acc,v)=>{
附件缓冲器推力(v)
acc.buffer.sort((v1,v2)=>v1.index-v2.index)
返回acc
}, {
最后一名:-1,
缓冲区:[]
})
.mergeMap(信息=>{
常数发射=[]
while(info.buffer.length&&info.lastEmissed+1==info.buffer[0]。index){
emission.push(info.buffer.shift())
info.lastEmissed+=1
}
返回Rx.可观察到的(发射)
})
.switchMap(排放=>{
如果(!emissions.length){//此条件表示出现故障
返回接收可观察计时器(超时)
.mergeMapTo(Rx.Observable
.throw(新错误('ORDER\u TIMEOUT'))
}否则{
从(排放)返回可观测的Rx
}
})
)
模拟消息
.do(x=>console.log('mocked',x.index))
.let(keepOrder(1000))//减少超时以增加错误概率
.do(x=>console.log('ORDERED',x.index))
.retryWhen(es=>es
.do(e=>console.warn('ERROR',e)))
.subscribe()


EMIT
序列号是连续的吗?初始序列号是已知的吗?@TEDDESTERNE-是的,假设在图片之前已经通信了0,因此前端知道它正在等待1。