功能:我有多个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方法,但由于对race
和forkJoin
的理解,我的代码应该可以正常工作。
由于我仅几天就进入Angular并试图在一天之内推送此要求,所以找不到时间来端对端阅读文档。
临时修订: 我使用基本逻辑来查找元素数量最多的响应,以从服务器中找出最新数据(因为我所有的请求都仅添加新的数据行)。
答案 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操作符仅采用最后一个。