Javascript 如何在RxJS中创建适当的队列,该队列由同时包含同步和异步函数的观察值组成

Javascript 如何在RxJS中创建适当的队列,该队列由同时包含同步和异步函数的观察值组成,javascript,promise,rxjs,observable,rxjs6,Javascript,Promise,Rxjs,Observable,Rxjs6,我的应用程序从服务器接收响应。这些响应可以单独接收,也可以多次接收,但它们总是按照各自处理和呈现的顺序接收 收到回复后,需要发生以下事情: 将呈现并显示键入指示器(同步) 响应数据被解析并转换为正确的格式(同步) 运行人工延迟以模拟“真人”类型(异步) 应删除/隐藏键入指示器(同步) 格式化的响应将呈现到屏幕(同步) 现在,所有这些步骤都需要按照收到的每个响应的顺序进行,也要按照顺序进行。这样做的最终结果应该是键入随机显示时间的指示器,然后消失,然后显示响应,然后再次显示随机时间的指示器,然后消

我的应用程序从服务器接收响应。这些响应可以单独接收,也可以多次接收,但它们总是按照各自处理和呈现的顺序接收

收到回复后,需要发生以下事情:

  • 将呈现并显示键入指示器(同步)
  • 响应数据被解析并转换为正确的格式(同步)
  • 运行人工延迟以模拟“真人”类型(异步)
  • 应删除/隐藏键入指示器(同步)
  • 格式化的响应将呈现到屏幕(同步)
  • 现在,所有这些步骤都需要按照收到的每个响应的顺序进行,也要按照顺序进行。这样做的最终结果应该是键入随机显示时间的指示器,然后消失,然后显示响应,然后再次显示随机时间的指示器,然后消失,然后显示下一个响应,等等

    我已经尝试了多种技术来使用RxJS实现这一点,但我正在努力让它发挥作用。我发现,无论我采用何种方法,响应(添加到类似队列的结构和/或按顺序执行)都会同时触发事件链。我不知道如何按顺序执行事件链,并等待前一个事件链在下一个事件链开始之前完成

    我尝试过使用包含
    .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()
    调用的旧承诺链中看到的那样。我猜/假设sync
    tap()
    调用抛出了async
    concatMap()
    调用?我会给你的方法一个机会,并报告回来,谢谢!接受,因为这对我的用例有效,所以谢谢!我仍然觉得自己有点困惑,最佳解决方案显然是
    concat
    一系列
    可观察对象,然后必须检查它们的
    类型
    属性,以确定如何/何时启动实际回调。我只是想能够
    concat
    将实际的函数调用与
    消息$
    可观察的函数调用结合起来,并让它们以串联方式执行,例如:
    返回concat(showTyping(),message$,hideTyping()).pipe(delay(2000))。哦,好吧,这就行了!通常情况下,最好保持可观察对象的纯粹性(没有副作用),否则很容易出现不可预测的行为并将事情搞砸