RxJs 可观察的顺序:管道中的操作符和通用高效实现

问题描述

上下文: 一个包含缺少外部 ID 引用的对象的数组 > 调用 API 来检索消息 ID 信封,如果存在的话 > 另一个 API 调用来检索实际消息 + 元数据。

3 个问题:

  1. 是关于实施的。我选择使用 concatMap 运算符而不是嵌套 Observables(mergeMap 也可能?Switchmap?其他地图运算符?)。这里涉及 2 个异步请求,每个请求只有 1 个结果,因此没有数据流。需要根据1个固定​​数组顺序调用:allTodosWithoutExtId

  2. 我想按顺序发出异步请求,其中内部依赖于外部请求的输入。如果没有必要,不要返回和 Observable/value(返回 EMPTY?)。最终生成的 updatePayloadArray 需要在单独的功能(关注点分离)中进行处理。返回 Empty 是一种优雅的方式吗?

  3. 内部和外部的日志产生相同的输出,我希望看到与所讨论的 Observable 特定调用相关的日志输出。似乎是序列 > 中最后一个 Observable 调用的结果,或者至少能够在 map 函数中,在/与前者中处理最后一个 Observable 输出的结果。

我认为最重要的 - 主要 - 问题是关于实施。我想避免嵌套,因为这种结构应该能够嵌套更深 2 层,并且很容易超过这个非常简单的序列顺序,它必须具有这种灵活性。避免订阅嵌套、混乱,使其高效/可读/易于理解。较少/不易出错。

retrieveMissingCloudIdsToApp() {

    const getMsg = (msgEnvelope: {}) => {
      let msgEnv;
      let id;

      if (msgEnvelope['result']['messages'] && msgEnvelope['result']['messages'].length > 0) {
        id = msgEnvelope['result']['messages'][0]['id'];
        msgEnv = this.getMessageByCloudId(id);
      }
      // else
      // external ID non retrievable > EMPTY
      return id ? msgEnv : EMPTY;
    };

    const getMsgidEnvelope = (todo: TodoModel) =>
      this.searchForIdRefInBodyText(todo._id).pipe(
        concatMap(getMsg),map((obj) => {
          // same logging result as outer log
          console.log('inner',obj);
          return obj;
        })
      );

    // this.allTodosWithoutExtId >> an array with TodoModel objects
    const retrievedExtIds = from(this.allTodosWithoutExtId).pipe(
      concatMap(getMsgidEnvelope),map((obj) => {
        // same logging result as inner log
        console.log('outer',obj);
        return obj;
      })
    );

    const updatePayloadArray: TodoModel[] = [];
    retrievedExtIds.subscribe({
      next: (value) => updatePayloadArray.push(value),// do some processing based on the results in Array
      complete: () => console.log('updatePayloadArray::complete',updatePayloadArray),});

  }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)