【问题标题】:Multiple HTTP calls using RXJS inside of pipe operator在管道运算符内使用 RXJS 进行多个 HTTP 调用
【发布时间】:2018-12-09 19:08:10
【问题描述】:

我有 3 个 API 端点(候选人、空缺和面试)。

{
    "candidates": [
        {
           "id": 1,
           "name": "Serj"
        },
        {
           "id": 2,
           "name": "Alex"
        },
      ],
    "vacancies": [
        {
           "id": 1,
           "title": "Java"
        },
        {
           "id": 2,
           "title": "JS"
        },
      ],
   "interviews": [
        {
           "id": 1,
           "candidateId": 1,
           "vacancyId": 2,
           "date": "2018-12-11"
        },
        {
           "id": 2,
           "candidateId": 2,
           "vacancyId": 1,
           "date": "2018-12-11"
        },
      ]
}

首先我会按日期接受采访,然后进行一系列采访。

const params = new HttpParams().set('date', '2018-12-11');
this.http.get('http://localhost:3000/interviews', {params}).pipe();

当我 subscribe()pipe() 的输出时,我想获得一系列采访,而不是 "candidateId""vacancyId" 是从适当的端点获取的实际对象 candidatevacancy

所以结果 (Interview[]) 应该是这样的:

[
  {
    "id": 1,
    "candidate": {
      "id": 1,
      "name": "Serj"
    },
    "vacancy": {
      // vacancy instance
    },
    "date": "2018-12-11"
  },
  // second interview object
]

感谢您的帮助!

【问题讨论】:

    标签: angular rxjs httpclient


    【解决方案1】:

    如果我理解正确,您希望过滤掉您的面试回复以包含一个对象数组,其中仅包含字段 CandidateId 和 vacancyId ?

    如果是这样的话,你可以使用这个方法:

    this.http.get('http://localhost:3000/interviews', {params})
      .pipe(
         flatMap(item => item),
         map(({ candidates, vacancies, interviews}) => 
            interviews.map(({ id, candidateId, vacancyId, date }) => ({ 
               id,
               candidate: candidates.filter(c => c.id === candidateId)[0], 
               vacancy: vacancies.filter(v => v.id === vacancyId)[0],
               date
            })
         )),
         reduce((acc, val) => [acc, val])  
      )
      .subscribe(response => console.log(response));
    

    已创建Stackblitz Demo 供您参考。

    【讨论】:

    • 感谢您的回答。我刚刚编辑了我的问题,以便更准确地了解预期的输出。
    • @EugeneChristo 已就更新的问题更新了 Stackblitz 演示。只需打开控制台,结果就在那里:)
    • 非常感谢!你很漂亮很善良:)
    • 最后一个 reduce 也可以写成:.reduce( _ => _ ) 因为 finally 你在 outer 数组中只有 一个元素 。即:[[1,2]].reduce( _ => _ ) 输出:[1, 2] 在您的情况下,将是 firstsecond 结果的对象。
    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多