Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不同方法的角度组合数据_Javascript_Angular_Rxjs_Observable - Fatal编程技术网

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机上的一行,下一笔交易(订阅)在前一笔交易完成后才能开始!欲知详情

您可能需要使用forkJoinzip运算符等待所有观察到的响应,并将其组合以生成最终结果,以获取更多详细信息


您可以使用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
    });
}