Javascript 如何在RxJS中创建适当的队列,该队列由同时包含同步和异步函数的观察值组成
我的应用程序从服务器接收响应。这些响应可以单独接收,也可以多次接收,但它们总是按照各自处理和呈现的顺序接收 收到回复后,需要发生以下事情:Javascript 如何在RxJS中创建适当的队列,该队列由同时包含同步和异步函数的观察值组成,javascript,promise,rxjs,observable,rxjs6,Javascript,Promise,Rxjs,Observable,Rxjs6,我的应用程序从服务器接收响应。这些响应可以单独接收,也可以多次接收,但它们总是按照各自处理和呈现的顺序接收 收到回复后,需要发生以下事情: 将呈现并显示键入指示器(同步) 响应数据被解析并转换为正确的格式(同步) 运行人工延迟以模拟“真人”类型(异步) 应删除/隐藏键入指示器(同步) 格式化的响应将呈现到屏幕(同步) 现在,所有这些步骤都需要按照收到的每个响应的顺序进行,也要按照顺序进行。这样做的最终结果应该是键入随机显示时间的指示器,然后消失,然后显示响应,然后再次显示随机时间的指示器,然后消
.tap
和.concatMap
函数的.pipe
链,以及从新建主题()
创建队列,并使用下一步()
向其中添加要执行的新项的解决方案。这些都不能解决我的问题
核心结构必须是某种类型的队列,我可以继续向其中添加项目,当队列完成/为空时,它们将自动执行。听起来像是一项任务。在下面的示例中,更改callback以更新您的UI/状态,它应该完成以下工作:
const{of,concat}=rxjs;//=要求(“rxjs”)
const{delay,concatMap}=rxjs.operators;//=要求(“rxjs/操作员”)
常量响应$=of(1,2,3,4,5);
常量事件$=响应$.pipe(
//按顺序处理项目的concatMap
concatMap(e=>{
const typing$=的({type:“typing”});
//在接收新消息之前添加延迟
const message$=的({type:“new message”,message:e}).pipe(延迟(3000));
//在每个响应之前添加延迟
返回concat(键入$,message$).pipe(延迟(2000));
})
);
活动$.subscribe((e)=>{
控制台日志(e);
});代码>
为什么主题和concatMap不起作用?很有趣。我想我的印象是我可以链接函数,而不是将所有功能包装在一个concatMap
调用中。例如,我在.pipe()
中按顺序使用了大量的.tap()
和.concatMap()
调用,就像您在一个包含大量.then()
调用的旧承诺链中看到的那样。我猜/假设synctap()
调用抛出了asyncconcatMap()
调用?我会给你的方法一个机会,并报告回来,谢谢!接受,因为这对我的用例有效,所以谢谢!我仍然觉得自己有点困惑,最佳解决方案显然是concat
一系列的
可观察对象,然后必须检查它们的类型
属性,以确定如何/何时启动实际回调。我只是想能够concat
将实际的函数调用与消息$
可观察的函数调用结合起来,并让它们以串联方式执行,例如:返回concat(showTyping(),message$,hideTyping()).pipe(delay(2000))代码>。哦,好吧,这就行了!通常情况下,最好保持可观察对象的纯粹性(没有副作用),否则很容易出现不可预测的行为并将事情搞砸