获取来自可观察对象数组的最新订阅响应-Angular 7

时间:2019-07-12 09:49:35

标签: angular rxjs

功能:我有多个POST请求,以使用不同的数据更新单个表。请求的响应将包含更新的表数据。

我将observables放入一个数组,并使用forkJoin从所有POST请求中获取结果。

但是仅需要最新收到的回复即可更新我的视图。我假设forkJoin将按POST个响应的顺序返回响应数组。

示例代码

getResponse ( inpDataArray: []) {
    let observableList: Observable<any>[] = [],
    HTTP_OPTIONS = {
      headers: new HttpHeaders({'Content-Type': 'application/json'})
    };

    inpDataArray.forEach(eachData => {
      observableList.push(
        this.httpClient.post('<SERVERURL>', eachData, HTTP_OPTIONS)
      ); // PUSH
    }); // FOR-EACH

    forkJoin(observableList).subscribe( (allResponseData: []) => {
      allResponseData.forEach( (eachResult, index) => {
        console.log('Result #', index, ' , length: ', eachResult.length );
      }); // FOR-EACH
    }); // FORK-JOIN
  } // FN

this.getResponse([
  {type:1, value:'data1'},
  {type:2, value:'data2'}
]);

// Response will contain the list of all the inputs sent as POST request - as an array of objects

结果: 随机地,我看到响应数组的最后一个元素不是来自最新POST请求的响应。

// Sample response
Result #1, length: 1
Result #2, length: 2


// Sample response
Result #1, length: 4
Result #2, length: 3

有人可以帮我解释我在做什么错吗?

尝试过的选项: 我尝试了其他几种RxJS方法,但由于对raceforkJoin的理解,我的代码应该可以正常工作。

由于我仅几天就进入Angular并试图在一天之内推送此要求,所以找不到时间来端对端阅读文档。

临时修订: 我使用基本逻辑来查找元素数量最多的响应,以从服务器中找出最新数据(因为我所有的请求都仅添加新的数据行)。

2 个答案:

答案 0 :(得分:1)

似乎最好更改您的API,以便可以获取有序的数据数组并仅返回最新更新。这样可以优化速度,因为您在网络中传输的信息较少。

但是,如果您只是想快速修复,则可以删除inpDataArray的最后一个元素,并将其存储在变量'lasInpData'中。

lasInpDataObs = this.httpClient.post('<SERVERURL>', lasInpData, HTTP_OPTIONS);
merge(observableList).concat(lasInpDataObs).last().subscribe(res => consle.log(res));

这可确保您在完成最后一个请求之前先完成所有其他请求。 “ Concat”仅在上一个完成时订阅下一个。 “最后一个”运算符过滤掉除最后一个结果以外的所有结果。

答案 1 :(得分:1)

如果只需要最后完成的响应,请使用merge:

merge(observableList).pipe(last());

merge将按照可观察对象的发射顺序来发射它们,然后您使用last操作符仅采用最后一个。