如何确保Observable流处理所有请求

时间:2017-03-03 19:33:44

标签: rxjs

我正在使用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 => {})
    })

1 个答案:

答案 0 :(得分:0)

mergeMap是您想要的运营商。

concatMap不同,它不会等待每个内部observable在连接下一个之前完成。 (事实上​​,concatMap相当于mergeMap with the concurrency parameter set to 1。)