Javascript 来自RxJS请求流的同步响应流
我是RxJS的新手,不知道是否有人能帮我 我想从请求流(有效负载数据)创建一个同步响应流(最好是对应的请求) 我基本上希望请求一个接一个地发送,每个请求都等待最后一个请求的响应 我尝试过这个,但它会立即发送所有内容():Javascript 来自RxJS请求流的同步响应流,javascript,reactive-programming,rxjs,Javascript,Reactive Programming,Rxjs,我是RxJS的新手,不知道是否有人能帮我 我想从请求流(有效负载数据)创建一个同步响应流(最好是对应的请求) 我基本上希望请求一个接一个地发送,每个请求都等待最后一个请求的响应 我尝试过这个,但它会立即发送所有内容(): var请求流,responseStream; requestStream=Rx.Observable.from(['a','b','c','d','e']); responseStream=requestStream.flatMap( 发送请求, (val,response)
var请求流,responseStream;
requestStream=Rx.Observable.from(['a','b','c','d','e']);
responseStream=requestStream.flatMap(
发送请求,
(val,response)=>{return{val,response};}
);
responseStream.subscribe(
项目=>{
控制台日志(项目);
},
错误=>{
console.err(err);
},
()=>{
console.log('Done');
}
);
函数sendRequest(val){
返回新承诺((解决、拒绝)=>{
setTimeout(()=>{resolve('+val的结果);},1000);
});
};代码>在您的第一个代码示例中,尝试将flatMap
替换为concatMap
,并告诉我结果行为是否与您所寻找的一致
responseStream = requestStream.concatMap(//I replaced `flatMap`
sendRequest,
(val, response)=>{ return {val, response}; }
);
基本上,concatMap
具有与flatMap
相似的特征,行为上的区别在于,它将等待当前可观察对象被展平完成,然后再继续下一个。因此,这里:
requestStream
值将被推送到concatMap
操作符
concatMap
操作符将生成一个sendRequest
可观察值,该可观察值中的任何值(似乎是元组(val,response)
)将通过选择器函数传递,其对象结果将传递到下游
- 当该
sendRequest
完成时,将处理另一个requestStream
值
- 简而言之,您的请求将被逐一处理
或者,您可能希望使用defer
来推迟执行sendRequest
responseStream = requestStream.concatMap(//I replaced `flatMap`
function(x){return Rx.Observable.defer(function(){return sendRequest(x);})},
(val, response)=>{ return {val, response}; }
);
谢谢你的回复。我尝试了您的解决方案,但请求仍然会立即发送。文档表明flatMap可能会导致交错,而concatMap不会。看来区别在于顺序。使用concatMap是有道理的,但它仍然不能产生所需的行为:发送A,当你收到A的响应时,发送B,当你收到B的响应时,发送C,等等。也许我误解了你想要的。在那种情况下你能试试推迟吗?我会更新code@user3743222我们如何在发出web请求之前发出类似“加载url…”的字符串?