我正在使用RxJS创建一个简单的Web服务器,但我不知道如何处理它。
如果不使用我的第一个地图而使用switchMap,服务器将调用处理程序,该处理程序返回一个observable。但是如果第一个请求仍在接收数据时另一个请求进入,那么如果新请求在第一个请求之前完成,则服务器将切换到新请求,而第一个请求将被删除,是否正确?
另一方面,如果我使用concatMap,它将调用处理程序,但它不会消耗任何更多的连接,直到第一个连接已收到所有数据并继续。这也没有意义,因为服务器会在处理快速连接(即GET请求)之前等待慢速连接(即POST文件上传)。
我应该使用哪种操作符?
Observable.fromEvent(server, 'request', (req, res) => { return { req: req, res: res } })
//should this be a concatMap or switchMap or what?
.map(state => {
state.data = [];
return Observable.fromEvent(state.req, 'data')
.takeUntil(Observable.fromEvent(state.req, 'end'))
.reduce((n, e) => { n.push(e); return n; }, [])
.map(e => {
var buf = Buffer.concat(e).toString('utf8');
try {
state.req.body = JSON.parse(state.data);
} catch (e) {
state.req.body = data;
}
return state;
});
})
.do(obs => {
//I want to do the next thing here, but first I
//have to consume the Observable, which doesn't make sense
state.do(state => {})
})
答案 0 :(得分:0)
mergeMap
是您想要的运营商。
与concatMap
不同,它不会等待每个内部observable在连接下一个之前完成。 (事实上,concatMap
相当于mergeMap
with the concurrency
parameter set to 1
。)