Javascript 不同方法的角度组合数据
我有来自三个不同服务的数据,我想将所有服务的数据合并到一个方法中Javascript 不同方法的角度组合数据,javascript,angular,rxjs,observable,Javascript,Angular,Rxjs,Observable,我有来自三个不同服务的数据,我想将所有服务的数据合并到一个方法中 this.data1 = this.activity1Service.getAllMonth(); this.data2 = this.activity2Service.getAllMonth(); this.data3 = this.activity3Service.getAllMonth(); this.alldata = concat (this.data1,this.data2,this.data3); 作为一个
this.data1 = this.activity1Service.getAllMonth();
this.data2 = this.activity2Service.getAllMonth();
this.data3 = this.activity3Service.getAllMonth();
this.alldata = concat (this.data1,this.data2,this.data3);
作为一个可观察的
GetAllData(): Observable<Data[]>{
return (this.alldata);
}
我不知道如何将来自不同服务的数据合并到一个方法中,请任何人提供帮助。我想您需要这样的方法:
import { Observable, combineLatest } from 'rxjs';
import { map } from 'rxjs/operators';
getAllData(): Observable<any[]>{
return combineLatest([
this.activity1Service.getAllMonth(),
this.activity2Service.getAllMonth(),
this.activity3Service.getAllMonth()
]).pipe(map([data1, data2, data3] => [...data1, data2, data3]))
}
import{Observable,combineLatest}来自'rxjs';
从“rxjs/operators”导入{map};
getAllData():可观察{
返回组合测试([
this.activity1Service.getAllMonth(),
this.activity2Service.getAllMonth(),
this.activity3Service.getAllMonth()
]).pipe(映射([data1,data2,data3]=>[…data1,data2,data3]))
}
combinelateest
将组合每个可观测数据的最新发射值,而在映射中,您可以根据需要使用一些逻辑来映射数据。您可以使用forkJoin
forkJoin等待每个HTTP请求完成,并等待组的所有
每个HTTP调用返回到单个可观察数组中的可观察对象
最后返回可观察的数组
类文件
getAllData() {
this.data1 = this.activity1Service.getAllMonth();
this.data2 = this.activity2Service.getAllMonth();
this.data3 = this.activity3Service.getAllMonth();
return forkJoin([this.data1, this.data2, this.data3]);
}
ngOnInit() {
this.getAllData().subscribe(aldata => {
console.log(data);
this.AllData = aldata
});
}
您可以使用$q.all()将多个API的承诺组合到单个响应对象,请查找下面的代码片段
var-app=angular.module('app1',[]);
app.factory('json',函数($q,$http){
返回函数(文件){
var承诺=[];
angular.forEach(文件、函数(文件){
var defered=$q.defer();
$http({
url:file,
方法:“获取”
}).
成功(功能(数据){
解析(数据);
}).
错误(函数(错误){
拒绝();
});
承诺。推动(不同的。承诺);
})
返回$q.all(承诺);
}
});
app.controller('MainCtrl',函数($scope,json){
$scope.name='World';
json([[1,2,3],[4,5,6]]),然后(函数(数据){
$scope.a=数据[0]
$scope.b=数据[1]
})
});代码>
{{a | json}
{b|json}
concat不等待从所有可观察对象接收响应,它完成一个可观察对象并发送其响应,然后处理下一个响应。因此,它不会结合可观察到的响应
你可以把concat想象成ATM机上的一行,下一笔交易(订阅)在前一笔交易完成后才能开始!欲知详情
您可能需要使用forkJoin或zip运算符等待所有观察到的响应,并将其组合以生成最终结果,以获取更多详细信息
您可以使用rxjs中的CombineTest:或查看forkJoin、merge等。这取决于您需要哪种方法来处理数据。以下是您可以使用的组合列表:这取决于您期望的输出。因此,您可能正在寻找forkJoin
,combinelatetest
或merge
。
getAllData() {
this.data1 = this.activity1Service.getAllMonth();
this.data2 = this.activity2Service.getAllMonth();
this.data3 = this.activity3Service.getAllMonth();
return forkJoin([this.data1, this.data2, this.data3]);
}
ngOnInit() {
this.getAllData().subscribe(aldata => {
console.log(data);
this.AllData = aldata
});
}