微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。