Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 来自RxJS请求流的同步响应流_Javascript_Reactive Programming_Rxjs - Fatal编程技术网

Javascript 来自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)

我是RxJS的新手,不知道是否有人能帮我

我想从请求流(有效负载数据)创建一个同步响应流(最好是对应的请求)

我基本上希望请求一个接一个地发送,每个请求都等待最后一个请求的响应

我尝试过这个,但它会立即发送所有内容():

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…”的字符串?